Skip to content

Bruce v0.17.0

Latest

Choose a tag to compare

@github-actions github-actions released this 06 Nov 02:54
· 12 commits to main since this release

Bruce 0.17.0 发布说明

新功能 (Added)

  • 官方网站落地主仓 website/:版本注入构建、同步门禁与 Pages 发布 (T27):
    • 站点迁入主仓:官网从 gitignored 草稿区迁入 website/(单页站点 + 面板/系统规格摘录与预览截图脚本,后者不进入构建),源码只写 {{VERSION}} / {{DMG_SIZE}} / {{EXE_SIZE}} 占位,构建时由根 VERSION 与 GitHub Release 资产元数据注入,输出 local/dist/site/;--strict 模式遇到未解析占位符即失败;
    • 同步门禁:check-site-sync.mjs 接入 verify-local,一次断言源码不写死版本号、必备占位符存在、厂商图标与 docs/assets 逐字节同源、README 版本徽章与正文版本行等于 VERSION;
    • Pages 发布:.github/workflows/site.yml 仅在网站路径 / 厂商图标源 / 构建与门禁脚本 / VERSION / 工作流自身变化时触发,先跑同步门禁再严格构建,经 Pages artifact 发布,与 App 的 CI/Release 解耦。
  • 新增仪表盘固定卡片快捷键 ⌘/Ctrl 1/2/3 与通用页只读说明 (C211):
    • 固定身份映射:⌘1 / ⌘2 / ⌘3 分别对应 Token 用量 / 订阅 / Agent 用量,与卡片拖拽顺序无关;顶栏 Tab 模式切换页签,纵向级联模式先滚动到目标卡片再切换折叠/展开;仅响应 key down(长按不连发),卡片当前不可用时静默 no-op;裸 1/2/3 正式退役;
    • 通用页只读说明:mac 与 Windows 均在「全局快捷键」分组卡内、唤出看板行后新增「卡片快捷键」行,右侧仅展示 ⌘1/⌘2/⌘3(Windows Ctrl+1/2/3)键帽,说明固定映射与双模式语义,不提供录制/编辑控件或持久化字段;
    • 双端同构:Windows 全局 keydown 使用 Ctrl 组合并忽略 event.repeat;mac DashboardShortcutPolicy 纯映射由 Harness 覆盖。
  • 用量历史聚合台账与全量读取:来源解耦、移除 30k 截断、覆盖全部 10 个 Agent (T26):
    • collector 自有 SQLite 台账:新增 collector-history crate,在 ~/Library/Application Support/Bruce/usage-history-v1.sqlite(Windows %LOCALAPPDATA%\Bruce\)按 agent / 日期 / 日×模型 / 月×模型 / 今日小时 / 今日工程保存派生数值(不存消息正文、路径、凭据);每轮全量本机扫描单事务单调合并(新扫描 total ≥ 存量才替换、扫描未出现的日期保留),来源修剪、会话文件删除、换根或部分扫描失败都不再抹掉已有历史;
    • artifact 从台账投影:daily / today / hours / dailyModels / monthModels / hourModels / projects 全部由台账窗口重建,成本仍按当前价表重算;App 侧数据来源不变(双端仍只读 artifact),清理用量缓存 仍只清快照与元数据、不删台账;
    • 来源消失不再丢用量:来源 found=false 但台账窗口内有量时输出 status = "history" 与「本机未发现会话来源,显示已保存的历史用量(最后同步 …)」note,mac / Windows 显示「历史」标签并视为非故障;此前「卸载或清理某个 Agent → 该 Agent 从 Agent 表现整段消失」在 10 个来源上统一修复;
    • 移除 30000 行截断:ZCode / OpenCode 全量与增量读取改为按 rowid / 时间游标流式逐行聚合(内存 O(1)、逐行取消检查,无 LIMIT),删除 MAX_SOURCE_ROWS / SourceScan.capped / LOCAL_SOURCE_ROWS_CAPPED,SQLite 缓存 schema 升至 v3;本机 ZCode 现有 39,719 行全部计入 182 天窗口,跨日全量重建不再丢历史,rowid 可用时增量缓存恢复;
    • 降级可解释:台账打开/迁移/读写失败仅输出信息级 LOCAL_HISTORY_STORE_UNAVAILABLE(不触发 envelope Partial),该轮回退为「仅扫描贡献」;台账损坏不删除既有数据。首次升级只能回补来源当前仍保留的数据,升级前已被修剪/删除的历史无法恢复。
  • Agent 用量新增 dsh (DeepSeek Harness) 本机会话统计 (C189):
    • 第 10 个本机来源 dsh:只读扫描 ~/.dsh/sessions($DSH_HOME 可覆盖家目录)下 session.vN.jsonl.zstd;dsh 每次追加事件各写一个独立 zstd 帧,引擎以多帧串接解码器读取并按 assistant/message 的 data.usage 采集四类 Token(inputTokens 非缓存输入、outputTokens、cacheReadTokens → 缓存读取、cacheWriteTokens → 缓存创建,派生 totalTokens 不重复计入);模型取 data.message.source.model 原样入价卡归一化(deepseek-flash、cline-pass/deepseek-v4.1-flash-1017 等),项目取会话 cwd 末段;
    • 去重与增量缓存:fork / seed 会话会继承历史消息,跨文件按 message id 摘要前 128 位去重(同键保留总量最大者);zstd 帧边界与行不对应、解压字节偏移不可用于追加,故缓存按文件签名(设备 / inode / 大小 / 修改时间纳秒)整文件重建,未变更文件只读观测不解压;
    • 双端呈现对齐:新增 DSH 品牌徽章(DeepSeek 官方图形 / 白底品牌蓝)与第 10 档系列色 azure #4d6bfe(含 4 档占比色阶,Nothing 绿阶固定第 1 档);设置中心与首次启动欢迎向导的本机探测新增 ~/.dsh/sessions(mac 9 → 10 个探测项、Windows 9 → 10 项),双端品牌身份对拍 fixture 同步新增 dsh 条目;调色板扩至 10 档后未知 agent(如 cline)的 FNV 散列落点一次性移位,双端同序仍保持一致,共享 golden 快照随之刷新 4 处 colorHex。
  • 订阅额度网络出口国家校验(出口IP检查 · 双卡分立 + 两级熔断 + 极简磁贴)(T23):
    • 核心校验与两级熔断:在发起云端订阅额度查询前,经本机专用代理端口(如 Clash Verge 7897)执行 Cloudflare Trace 出口探测;国内出口(CN)快速短路熔断,目标国家不匹配或探测失败时严格阻断查额并保护合格历史快照,绝不误标失效或回退直连;
    • 仪表盘纯净国旗呈现:订阅用量卡片标题右侧彻底去除深灰胶囊包裹底框,采用纯净裸国旗 Emoji 自然流排版(如 Claude 🇺🇸);阻断态以轻量 ⚠️ 🇺🇸 警示并提供 40px 紧凑问题小卡片;
    • 设置中心「出口IP检查」卡片:双卡分立解耦凭据,采用极简单行磁贴架构,现代 PORT [ 7897 ] 紧凑胶囊输入与自动保存,受保护服务采用纯品牌瓷砖图标展示并具备数量折叠(上限 3 个,超出折叠为 +N 胶囊)与智能隐藏;
    • 新建出口通道向导:列表底部提供虚线新建磁贴卡片,点击唤起 3 步 Fluent 弹窗向导(目标国家磁贴网格选择、自定义代码点击激活防默认抢焦、代理端口与扫描填充、受保护服务勾选分配),彻底告别弹窗垂直滚动条。
  • macOS 原生开机自启动与设置中心/欢迎向导双入口配置 (T25):
    • 基于 macOS 14+ ServiceManagement.SMAppService.mainApp API 封装合规无侵入的自启动服务抽象,彻底规避隐式 LaunchDaemons/LaunchAgents;
    • 设置中心「通用」面板落地标准 Switch 开关;当系统登录项权限被系统策略拦截(.requiresApproval)时,即时提示「需在系统设置中允许」并提供一键跳转系统偏好设置;
    • 首次启动欢迎向导(Welcome Wizard)Step 3 外观与快捷唤出页同步内嵌「开机自动运行」偏好卡片,与设置页及底层服务双向实时联动;
    • 配置持久化于 config/onboarding-v1.json(POSIX 0600),旧配置缺失键时平滑向前兼容;提供 MockLaunchAtLoginService 供测试与 Preview 隔离。
  • 首次启动双栏沉浸式欢迎向导(方案 A · macOS / Windows 双端同构)(T22):
    • 打造 780 × 540 独立双栏沉浸式三步欢迎向导(左侧 224pt 品牌导览栏展示真实 Puppy 比格犬 App 图标、三步导航轨与 100% 本地只读隐私承诺卡),彻底替换原冷启动直接弹设置窗口与钥匙串授权的割裂流程;
    • Step 1 环境扫描与合并激活:只读检测本机 9 个 AI Agent(Codex、Claude、Cursor 等)会话目录与 CC Switch 账号库,将本地 Token 统计与 0600 本机凭据存储合并为一键激活;支持存量老用户免打扰平滑升级;
    • Step 2 订阅额度连接:提供本机 CLI / CC Switch 订阅账号一键快速导入与 10 家服务商卡片,支持跳过;
    • Step 3 偏好定制与双环实时预览:支持菜单栏 I-2 双同心子母环实时预览、主题风格(经典/液态玻璃/Nothing)、卡片布局(纵向级联/顶栏分页)与默认快捷键定制;完成向导后自动关闭并即刻展开菜单栏主看板。
  • 菜单栏图标与字体升级:I-2 双同心子母环与 Nothing 主题排版联动 (C180):
    • 菜单栏状态项升级为 I-2 双同心子母环规(外母环 r=6.8pt 映射全局平均剩余额度,内子环 r=4.0pt 映射最低短板额度),内外环独立按三色阶(翡翠绿 $\ge 30%$、警示琥珀 $15% \sim 30%$、科技红 $< 15%$)着色;刷新态呈现双向差速自旋;
    • 字体与排版随主题自适应联动:经典与液态玻璃主题采用 T-0 规范(12pt 等宽数字 + Cap-Height 光学垂直居中与 4pt 步进防抖);切换至 Nothing 极客点阵主题时自动切换为 T-4 规范(11pt SF Mono Semibold + 弱化斜杠分隔符与大写单位),与下拉面板风格达成 100% 视觉统一;
    • 设置中心「通用」面板的菜单栏实时预览条同步对齐,保持所见即所得。

调整与优化 (Changed)

  • 热力图窗口末日锚定今天 (C223):近半年热力图窗口末日改为 max(daily 数据末日, 今天);今天没有任何 Agent 用量时仍生成今天的 level 0 格,footer 截止日期显示今天,未来日保持空槽;mac makeUsageHeatmap 与 Windows make_usage_heatmap 同步,14 日柱与按月区块窗口不变。
  • 热力图首尾列铺满(完整 7 天块)(C219):热力图每列 7 格全部渲染,level 0 / 空槽取主题空槽色(经典 primary 7% / Nothing surface-raised);mac 与 Windows 均不再出现透明缺口或未来格,首尾列自然铺满。
  • 经典 / 液态玻璃强调色对齐 Nothing 杏 / 绿 (C220):新增统一 accent(浅色 #D4A843 / 深色 #4A9E5C);hero 渐变改为 accent 深浅阶(#B8860B → #E3BE6B / #2A6B3C → #8CCB98),成本、月度 chip 当前/选中态、代码流 tint、订阅账号标签与热力图 1-5 档(20/40/60/80/100% 透明度)全部取该色系;五档 tier 彩色退役。Windows 新增 --panel-accent 面板 token,设置页 --accent 蓝色保持不变。
  • Nothing 浅色 Agent 卡图表改杏色 (C221):PanelAgentColor.nothingRampHex 浅色档由深绿五阶改为杏色五阶(#946A08 → #F0D69A);14 日点阵柱分段、图例徽章、行首色点、逐小时走势线与模型/项目明细条同步改杏色,深色绿阶不变。
  • 14 日柱总量改为悬停显示 (C222):经典 / 液态玻璃与 Windows fluent 的 14 日柱当日总量默认隐藏,悬停该日期列才淡入(mac chartOverlay 精确映射日期,Windows .day:hover);标注行与 y 域余量保留,柱高、日期轴与图例不位移;Nothing 点阵柱语义不变。
  • Token 用量热力图移除呼吸动效,双端全主题静态渲染 (C213):删除 mac HeatmapBreathingPolicy / DashboardPanelAnimationPolicy.allowsHeatmap 与图层呼吸动画,热力图保留单 NSView + 每格 CALayer 的渲染承载但格子透明度恒 1;Windows 删除 nothing-heat-breathe / --lo / 逐格 --d 相位,热力图、图例与收起态迷你周格均不再呼吸;Nothing 档位绿阶与经典 tier 色、底部单行日期/图例保持不变。
  • 顶栏 Tab 切换器去底色、保留 1px 发丝框、选中图标变色 (C214):双端移除容器填充与选中胶囊/滑块(mac 删除 matchedGeometryEffect 药丸与 tabPillNamespace,Windows 删除 #tab-active-pill 与 translateX 位移);容器仅保留 3pt 圆角 + 1px 发丝描边,选中图标经典取主文本色、Nothing 取 accent(深色 #4A9E5C / 浅色 #D4A843),未选中 secondary;图标尺寸、hover 提示与 ⌘/Ctrl 1/2/3 切换不变。
  • 订阅 Provider 用户可见名称 OpenCode GO / OpenCode Go 统一改为 OpenCode (C215):mac SubscriptionProviderID.displayName、collector CatalogSpec.display_prefix(决定订阅卡 section 名)、Windows settings providers 清单、配置面板/错误文案、README/官网与设计文档统一为 OpenCode;内部 provider ID opencodeGo / opencode-go、存储键 opencode-go:oauth、credential_field、官方端点与账号派生保持不变,旧凭据无需迁移。
  • Agent 用量展开明细统一为紧凑条形方案 C (C216):模型段与项目段在经典 / 液态玻璃 / Nothing 下统一为「段头数量 + 序号 + 名称 + 内联占比条 + 百分比 + Token」;Top3 + 「其他」全部保留、<1% 特例保留;删除 100% 堆叠条、点阵导引、6-Tick 与 PRJ.CONSOLE 控制台,双端同步(Windows 新增 .detail-compact / .dc-*,删除 stackedShareBar / detailGroup / nothingProjectConsole)。
  • 移除 Token 用量卡 LIVE 徽标与绿色方点 (C210):mac UsageHeroCard 标题行状态槽不再渲染 LiveIndicator(绿点光环 + LIVE 文本,Nothing 方点变体),Windows usageCard 同步移除 live-badge 与 .live-* 样式;顶部 Bruce 左侧四色状态灯及其 isLive 新鲜度光环保留不变。
  • Agent 用量卡默认展开首个有明细 Agent、正文刷新与今日空态 (C212):
    • 默认展开:每次进入 Agent 页签或从收起态展开卡片,自动打开第一个有模型/项目明细的 agent;无明细行保持全收起,数据刷新不重置用户手动状态;
    • 正文刷新:有数据时「今日」行右侧仅显示 14×14 无边框刷新图标(与订阅 Provider 定向刷新同大小/样式,删除「0 – 23 时」文案),点击只跑本机会话采集、不查询订阅额度并保留上一份订阅 services;刷新中显示小型进度环,面板隐藏或关闭动效时不挂载;
    • 今日空态:今日无用量时不显示「今日」行;有近 14 日历史则保留柱状图、只在图标/文案下方显示唯一刷新按钮;无历史则不渲染柱状图,标题为「暂无 Agent 用量」;收起态迷你摘要显示「暂无用量」,不再显示峰值 0。
  • 移除「锁屏暂停订阅刷新」「额度预警气泡」两项通用配置,转为恒开默认行为 (C209):
    • 锁屏订阅抑制恒开:电脑锁屏期间照旧抑制非手动的云端订阅额度查询、跳过额度边界提前唤醒,解锁后按相位与去重窗口补偿一次刷新;RefreshScheduler 不再读取开关,OnboardingConfiguration.pauseSubscriptionRefreshOnScreenLock 持久化键退役(旧配置遗留键按未知键忽略);
    • 额度预警气泡恒开:菜单栏 / 托盘图标锚定气泡恒可投递(mac 仍受主看板可见时静默的展示策略约束;Windows 自动刷新跨越即投递、手动刷新仅观察不投递,50/80/95 阶梯去重与窗口重置恢复不变);systemNotificationsEnabled / notifications_enabled 持久化键退役,设置中心通用页两行与官网设置演示同步移除;
    • 死代码清理:QuotaAlertNotifier(UNUserNotificationCenter 通知路径)与 SystemNotificationDeliveryPolicy 自 C159 改为图标锚定气泡后已无生产调用方,随开关退役一并删除;
    • 向前兼容:双端解码器均忽略未知键,含两个退役键的旧配置文件可无损加载;mac retiredLegacyKeysStillDecode 与 Windows 遗留 JSON fixture 用例守护。
  • 移除仪表盘顶栏 Tab 切换器 Agent 活跃图标绿点角标 (C208):Tab 模式下第 3 个图标右上角的呼吸绿点角标双端退役(mac Circle 角标与承载层 / win #tab-active-dot + tabBreathe 呼吸动画整体移除),活跃 Agent 数量仅保留悬停提示(mac「(N 个运行中)」/ win 按钮原生 tooltip);三卡切换、滑动滑块与选中药丸不受影响。
  • 仪表盘顶栏 Tab 切换器 Nothing 选中态改用点阵数字同源色 (C207):Nothing 主题下顶栏三图标分段切换器的选中高亮由纯黑白反色(浅色黑药丸底 / 深色白药丸底)改为跟随当前模式点阵数字 accent——浅色 #D4A843 黄底黑字形、深色 #4A9E5C 绿底白字形,与模型用量 tier chip(UsageHeroCard.tierSegment)同口径;Classic 主题选中态与未选中态字形保持不变,Windows 端 Nothing 选中色为独立实现,本卡不涉及。
  • 卡片展开掉帧:用量热力图呼吸改由图层宿主与 Core Animation 承载 (C179):Nothing 主题下近半年热力图(约 180 格)此前每格一个 SwiftUI 视图并各挂一条 repeatForever 呼吸动画,展开时首帧集中建树、逐帧在主线程求值,展开过渡开头即掉帧(同进程交错 A/B 探针 12 轮:展开丢帧均值 2.42 → 0.42,展开首帧最长间隔中位 50.2 → 24.8ms)。现在整张网格由一个 NSViewRepresentable 图层宿主承载、每格一个纯色 CALayer,呼吸交给 Core Animation 在渲染服务逐帧插值,相位、曲线、透明度区间与门控(面板可见 ∧ Nothing ∧ 有填充格 ∧ 动效未抑制)保持不变;离屏像素对拍 Nothing 深浅色 × 静态/低谷/峰值 maxΔ ≤ 1,经典主题 2pt 圆角抗锯齿差 1.7–2.1% 像素。
  • 用量热力图底部改为单行:起始日期 · 程度图例 · 截止日期 (C202):
    • mac 用量卡热力图底部由「起止日期轴 + 独占一行的右对齐图例」收为一行:起始日期贴网格左缘、程度图例(「少」 + level 0-5 色块 + 「多」)水平居中于网格中心、截止日期贴右缘,底部少一行且图例不再随日期文字宽度漂移;
    • Windows 端 apps/win/ 同步镜像(.heat-footer 三列网格 1fr auto 1fr,.heat-start / .heat-end 各自贴边),字号 9pt、Nothing 主题字体与颜色口径不变。
  • 订阅卡出口问题卡改为单行紧凑布局,标题改用「出口 IP 泄漏」 (C188):
    • 阻断态问题卡由 40pt 双行压缩为 30pt 单行:警示图标、标题、1px 分隔与保护说明同排,右侧「去设置 / 重测」以 8pt 间距 + 1px 竖线分隔;
    • 阻断态标题行下与卡片下各留 10pt(原 3pt / 0pt),解决黄色问题卡贴住 Provider 标题与进度条的问题;卡片本体反而比原实现矮 10pt,非阻断段落保持原 3pt 节奏;
    • 国家不匹配不再用 US ≠ SG 作为标题,固定显示「出口 IP 泄漏」,对比信息移入卡片悬停提示(预期 SG · 探测为 US);国内直连 / 探测失败 / 出口未知 / 配置无效保留各自原因文案,状态预警气泡徽标文案不受影响。
  • 菜单栏图标高级重构:德系包豪斯整体订阅单轨星规与新三档动态色阶 (C183):
    • 单轨星规几何与整体订阅映射:彻底移除致密拥挤的双同心子母套圈,升级为极简德系包豪斯单轨星规(The Orbit & Satellite);1.4pt 极细单轨完整映射整体订阅剩余额度(subscriptionQuotaRatio),并在当前弧端嵌合 1.8pt 卫星定位圆点与 0.75pt 高光微核,赋予机械腕表级精致微观质感与克制高级感;
    • 新三档动态预警色阶:色阶动力学切换为 $&gt;50%$ 翡翠绿(深色 #30D158 / 浅色 #15803D)、$20% \sim 50%$ 警示琥珀橙(深色 #FFB800 / 浅色 #D97706)、$<20%$ 科技红(深色 #FF453A / 浅色 #DC2626);
    • 平滑自旋动效与设置页预览条对齐:刷新态由卫星定位点沿轨顺时针 60fps 平滑自旋替代原双环差速撕裂感;设置中心「通用」面板的实时菜单栏预览条同步升级为单轨星规与新色阶算法。
  • 调整仪表盘:订阅用量最后刷新时间由标题右侧移至卡片底部右侧与三档用量标注平齐 (C182):
    • 订阅用量卡片标题行(CollapsibleCardHeader)在展开态不再展示最后刷新时间,标题行更加极简聚焦;
    • 最后刷新时间(updatedText)移至订阅用量卡片展开态底部右侧,与左侧三档用量图例(<50 / 50–79 / ≥80)经弹性 Spacer 撑开在同一水平线平齐对齐;非 Nothing 主题下同样在底部分隔线下右对齐展示;
    • Windows 端 apps/win/ 同步镜像适配(cardHead 状态件置空,底栏 Flexbox 居左图例、居右平齐刷新时间)。
  • 菜单栏 Nothing 主题字体微调:字号由 11pt 放大至 12.5pt (C181):
    • 将 Nothing 极客点阵主题下的菜单栏文本字号从 11pt 放大至 12.5pt(SF Mono Semibold),消除原 11pt 等宽字体在 22pt 菜单栏高度中视觉偏小、偏窄的问题,视觉面积与高度同经典主题 12pt 达成平衡;
    • 动态宽度计算与 capHeight 光学垂直居中公式自适应适配,上下保留约 4.5pt 舒适呼吸空间;设置中心实时预览条 1:1 同步对齐。

调整与优化 (Changed)

  • OpenCode GO 配置入口对齐 API Key 表单族 (C205):配置 UI 从 Cookie 时代的长文粘贴框切换为与 DeepSeek/Kimi/Jev/Cline 一致的 API Key 配置面板(mac APIKeyProviderConfigDialog / Windows kind:apiKey 表单):API Key 必填掩码输入 + Workspace ID 选填(多工作区账号显式指定,留空由服务端按 Key 推断,Windows 表单族同步获得可选字段支持);面板自带多账号列表(添加/重命名/删除,accountID 按 apiKey 派生自动 upsert,采集端逐账号查询出卡);指引附 OpenCode Console 外链。旧 Cookie 账号可在账号列表直接删除;粘贴入口退役。

修复 (Fixed)

  • 订阅卡单账号段补显「上次成功」时间,旧快照不再伪装成实时 (C224):查额失败或被跳过(冷却 / 过期回填)时 collector 沿用上一份窗口并标 stale,此前只有多账号子卡显示「上次成功 HH:mm」,占绝大多数的单账号 Provider(含 DeepSeek 等纯余额型)旧百分比与实时数据外观一致;mac / Windows 视图模型新增 section 级 lastSuccessText(多账号段恒空),单账号段在说明行后渲染同款标注,双端对拍 golden 同步新增该字段。
  • 纯余额型订阅「订阅状态」槽改用状态灯映射表 (C225):此前状态点恒为绿色、非 ok 态直出 error / partial 英文状态码;现与顶部状态灯共用 statusLabel / sectionTone,显示「失败」「部分失败」「暂无数据」等中文态名,点色按阈值三色(绿 / 黄 / 红)与中性灰分档。
  • Agent 用量卡 14 日柱顶部总量标注被裁与图例徽章过大 (C218):mac 14 日柱 y 域由 0...峰值 改为 0...(峰值 × 1.20),最高柱占绘图区约 83%,顶部留出约 13.6pt 给当日总量标注,800.0M 等最高柱数字不再被 chart frame 裁掉上半截;14 日图例厂商徽章由 14pt 收敛到 12pt,mac 新增 usesBrandChrome、Windows 新增 forceBrand,12pt 仍保留品牌真彩/位图与系列色环(不退回系列色瓷砖);行首 agent 徽章保持 14pt,C217 的 3pt leading 内缩保留。
  • mac Agent 用量卡厂商徽章左侧被裁切 (C217):HourlyLineCard 末尾的 .clipped() 裁在卡片内容左缘,AgentBrandBadge 的系列色环通过 padding(-1.5) 外扩,14 日图例首项与每个 agent 行首徽章贴边导致左半边(色环与 tile 左圆角)被裁。现在 dailyLegendRow 与 headRow 各留 3pt leading 内缩,徽章完整落在裁剪线内;行高、24 点折线宽度与右侧总量位置不变。Windows 侧卡片裁剪在卡片外缘,无此问题,未改动。
  • 订阅额度预警窗口重置后不再报警 (C206):5h 窗口依次触发 50/80/95 三档气泡后,即使服务端重置该窗口(换入新周期),用量再次越过阈值也不再弹气泡——去重状态只按 serviceID|windowLabel 记「最高已发档位」,且仅在采到 ≤50% 的采样时才清空;重置若发生在两次刷新之间(重置后用量很快又超过 50%)或重启时被缓存快照回填覆盖,旧 95 档记忆会带进新窗口,把新周期的 50/80/95 全部拦下。现在双端去重状态为每个键额外记录上次观察快照(usedPercent + 窗口重置时刻 resetsAt 归一化 token),命中「用量较上次下降超过 20 个百分点」或「两次采样 resetsAt 均非空且不同」即视为换窗、清空档位记忆并按首次跨越重新放行;resetsAt 支持采集端实际输出的整数 epoch 秒(旧实现只读字符串,窗口身份信息一直缺失)。回落清理、持续超标去重、手动刷新只同步不弹的既有语义不变。
  • OpenCode GO 用量查询切换官方端点与 API Key 配置 (C204):额度查询弃用 opencode.ai 控制台私有 server-fn 抓包(内容哈希 id 随控制台重新部署即失效、Fe26 浏览器 Cookie 会过期且无法判过期、seroval 私有序列化格式需约 200 行专用解析器),改用 opencode 官方客户端同源的 GET opencode.ai/zen/go/v1/usage(Bearer 认证)三窗口直读:5 小时滚动窗 / 每周 / 每月各带用量百分比与绝对重置时间(原为相对秒按采集时刻换算),rate-limited 窗口照常展示不再凭空消失;seroval 解析器整体退役。凭据配置从「浏览器开发者工具抓 auth Cookie 与 wrk_ ID 粘贴 JSON」改为「OpenCode Console → API Keys 创建 oc_sk_... 直接粘贴」(裸 key 自动包装,多工作区可粘贴含 workspaceId 的 JSON 显式指定),账号身份改按 apiKey 派生;旧 Cookie 凭据双端一律判「待重配」提示改用 API Key,不迁移。401/403 显式提示 key 失效或未订阅 Go。mac / Windows 双端同步(评估器、粘贴入口、指引文案与凭据校验)。
  • macOS 版运行中自动退出修复 (C203):安装版 v0.16.0 起每天多次自行退出(诊断报告 19 份完全同栈):菜单栏图标的 NSImage(drawingHandler:) 绘制闭包内 attrString.size() 文本测量走 NSStringDrawingEngine 的 CoreText 排版路径,在离屏上下文中偶发属性字典插 nil(NSInvalidArgumentException → SIGABRT);C180 引入该测量当天首崩,刷新动画每 50ms 强制重绘放大了命中概率。现在绘制闭包内严禁一切文本测量 API:排版高度改由字体度量(ceil(ascender + |descender|))推导、宽度沿用闭包外已有的 targetStatusItemLength 测量,指标字体(经典 T-0 / Nothing T-4)提升为控制器级缓存,闭包内只执行 draw(in:);NativeLifecycleHarness 新增 2,000 次双主题高频光栅化压力回归用例。
  • Claude 等 JSONL 来源与 dsh 的会话文件读不到时附说明 (C201):C196 / C192 之后,单个会话文件读取或解析失败只跳过该文件、有上次结果则沿用,但界面没有任何提示;Codex 在同样场景会附说明(C197)。现在 Claude / CodeBuddy / Kimi / Pi / Grok 与 dsh 也以信息级说明「会话文件读取失败 N 个, 本轮沿用上次结果或暂未计入, 下次刷新重试」附在该来源 note 后(不显示错误);扫描时文件刚被删除、dsh 正在写入的末帧不算读取失败。实测:已缓存的 Claude 会话追加后变为不可读,Claude 保持 ok、用量 1,380 不降、note 附说明,恢复后 1,900、说明消失;本机真实数据无说明。
  • mac 状态灯的部分失败原因不再被信息级说明盖住 (C200):采集部分失败时,mac 以 envelope 的第一条诊断作为状态灯 hover 原因与模块状态说明;C198 起来源说明(如「Codex 会话副本已分叉…」)以信息级诊断输出,排在真实故障(如 ZCode 数据库不兼容)之前时,原因会显示说明而不是故障,宿主追加的凭证写回失败同样会被盖住。现在取第一条非信息级诊断,全部为信息级时才取第一条;信息级诊断码清单由 collector 与 mac 共用一份 fixture 校验,新增时两侧测试同时把关。Windows 以运行态机器码给原因,不受影响。
  • 用量历史台账可修正已落库的多计 (C199):T26 台账按日取大、只增不减,少计时保护了历史,但任何多计一旦写入就永久保留(如 C194 的 Grok 重复计数:7 日视图 640、真实 340)。现在每个来源声明「派生口径版本」,只在修复多计的解析规则变更时升版(本批次只有 Grok 升到 2);升版后来源第一次可见的全量扫描轮,扫描窗口内的日期按新值替换(允许向下、扫描没有的日期删除),起始日在窗口内的整月一并替换,之后恢复单调合并。台账 schema 升 v2(只加一列,既有来源记为基线版本,升级本身不触发修正)。实测:旧版本写下的 Grok 640 在升级后首轮变为 340、日与月一致,之后保持 340;本机真实台账由旧版本写入后再用新版本运行,迁移通过、各来源数值不变。代价写入设计:修正轮之前已被来源删除的窗口内日期会降到当前可见值。
  • Grok 跨日追加后历史用量重复计数修复 (C194):Grok 会话没有消息级时间,Bruce 以文件修改时间作为全部消息的使用时间,且每次追加都把已有消息整体改记到最新修改日;叠加用量历史台账按日取大,追加一次就会让旧日期与新日期各记一份(实测 07-26 写入 300、07-27 追加 40,7 日视图显示 640、月行却为 340)。现在来源带消息级时间时优先使用;没有时已记录的消息保留首次记录的日期,只有新追加的消息记到新日期,日与月一致(实测 340 / 340)。Grok 改用独立的解析口径版本,修复只重建 Grok 的缓存;Grok note 补充「不含每轮重发的上下文, 偏低」。升级前已写入台账的重复值不会因本条消失,由 C199 修正。
  • dsh 一帧损坏不再丢掉整个会话 (C192):dsh 会话每次追加写一个独立的 zstd 帧,此前任一帧解码失败或超过 8 MiB 上限,整个会话文件都按损坏跳过(首次扫描时该会话本轮为 0,永久损坏的文件每轮整文件重解压再失败);8 MiB 上限也只在帧头声明长度时生效,而 dsh 帧头从不声明,实际是整帧解码进内存后才检查。现在逐帧隔离:损坏或超限的帧只跳过该帧并计数,帧间混入无法识别的字节时按 zstd 魔数重新同步,活写时被撕裂的末帧之前的内容照常计入;上限在解码过程中逐块执行,病态帧不再先占满内存。部分成功的结果照常缓存,坏帧数以信息级说明附在 dsh note 后。实测本机 dsh 17 个会话、7,087 帧用量修复前后一致(320,249,258),冷扫耗时不变。
  • 单个会话文件消失或不可读不再让整个来源当轮丢量 (C196):Claude / CodeBuddy / Kimi / Pi / Grok 共用的 JSONL 引擎中,文件在扫描列目录与读取之间被删除、截断或变为不可读时,此前整个来源本轮失败——用量按 LOCAL_SOURCE_IO_DEGRADED 整体跳过、envelope 变为部分失败,Claude 还被误标为「本机未发现会话来源, 显示已保存的历史用量」。现在只跳过出问题的那个文件,其余文件照常计入;解析失败时沿用该文件上一次的缓存结果(与 dsh、Codex 同口径),下一轮重试。实测(临时 home,Bruce-collector):已缓存的 Claude 会话追加后变为不可读,修复前 Claude 显示 history + IO_DEGRADED + envelope partial,修复后保持 ok、用量 1,380 不降,恢复后 1,900;本机真实数据各来源修复前后一致。
  • 超过 1 MiB 的疑似用量记录不再静默跳过 (C195):单行超过 1 MiB 的会话记录一直按截断跳过,用量可能静默少计、artifact 无任何提示。现在只统计保留前缀命中该来源结构化用量字面量的超长行(Claude / Pi "assistant"、CodeBuddy "assistant" / "function_call"、Codex "token_count"、dsh "usage" 等),计数随缓存保存,非零时以信息级说明「N 条疑似用量记录超过 1 MiB 单行上限, 已跳过未计入」附在该来源 note 后;工具结果、图片等超长行不产生说明。本机 Claude 的 4 条超长行均为工具结果,冷、热两轮均无说明,各来源用量修复前后一致。目录深度上限只防 symlink 环,维持现状。
  • 来源 usage 字段改名不再静默记 0:口径漂移哨兵;Codex 计入缓存写入 (C193):来源升级改了 usage 字段名或嵌套时,Bruce 此前静默记 0 或丢行、agent 仍显示正常,用户只会看到数字骤降。现在每个会话文件 / 数据库记录「末尾连续取不到用量的记录数」,会话文件末尾连续 5 条以上、数据库最近 20 行以上即以信息级说明「疑似来源 usage 字段口径变化: …」附在该来源 note 后(不显示错误;计数随缓存保存,命中缓存的轮次不消失)。覆盖 Claude、CodeBuddy、Kimi、Pi、Codex、dsh、OpenCode、ZCode(Grok 按内容估算不参与);dsh 与 OpenCode 的入口预筛同时放行不含用量字段的助手消息,避免改名后的行被静默滤掉。Codex 0.164+ 的 cache_write_input_tokens 此前被忽略、写入部分按普通输入计;按 Codex 源码口径(包含在 input_tokens 内)现单列为缓存写入、从输入扣除,总量不变(本机真实数据该字段全为 0,数值不变;价卡未列 OpenAI 缓存写入价,费用按输入价计也不变),Codex 按文件缓存 schema 升 4。实测本机全部真实来源(Claude / Codex / ZCode / dsh / CodeBuddy)冷、热各一轮均无哨兵说明,各来源合计修复前后一致。
  • Codex 旧版 rollout 累计计数回退时少计修复 (C191,低优先级防御):只有累计计数(total_token_usage、无 last_token_usage)的旧版 Codex 事件,计数中途回退(如恢复会话后从 0 重计)时,此前在超过旧高水位之前一律记 0;现在回退到从未出现过的值按新基线计入,回退到见过的值仍视为重放快照不计。有回退的会话以信息级说明「Codex N 个会话的累计用量计数中途回退, 已按新基线计入」附在 note 后(计数随缓存持久化,命中缓存的轮次不消失),Codex 按文件缓存 schema 升 3。本机 1,413 条事件全部带 last_token_usage,真实用量修复前后一致。
  • Codex 跨根同名副本少计与误报冲突修复 (C190):CLI 与 Orca(会话目录 / 账号目录)里同名的 rollout 是同一会话的副本,此前整份只保留 size 最大的一份、其余整体丢弃——分叉副本的另一支静默少计,Orca 旧前缀副本还因 size 不同被判「内容冲突」让 Codex 每轮显示错误。现在每份非相同副本都解析(硬链接 / 内容相同的副本仍零解析跳过),按单次响应去重后取并集:Codex 0.164+ 用 token_usage_record 的 response_id,旧版 rollout 回退为时间戳 + 本次用量;共享前缀只计一次,不会多计(台账单调,多计不可回退)。前缀副本不再算冲突;真正分叉时以信息级说明「Codex 会话副本已分叉, 已按单次响应合并 (会话组: N)」附在 note 后。Codex 按文件缓存 schema 升 2,首次刷新整体重解析一次(同时修复 C197 之前写成的空条目)。实测(临时 home 双根,Bruce-collector):分叉副本 12,430 → 12,760(真值),前缀副本 660 不变且不再显示错误;本机真实 ~/.codex(42 个会话、1,406 条响应全部带 response_id)182 天合计修复前后一致,release 构建冷扫 0.15 s、热扫 0.08 s 与修复前持平,缓存文件 153 KB → 256 KB。
  • Codex 会话文件一次打不开即永久记 0 修复 (C197):Codex 按文件缓存此前把 rollout 打开失败(并行工作池 EMFILE、iCloud 已逐出、属主不同、瞬时 EINTR 等)当作「解析成功的空文件」,以当前文件身份写入空条目;文件恢复可读后身份不变、永久命中该空条目,已结束的会话再也不会重解析,且 artifact 仍为 ok、无任何诊断。现在打开 / 读取失败一律不写缓存条目:有旧条目时沿用其上次结果(与 dsh 活写兜底同口径),没有则本轮暂不计入,下一轮重试;本轮失败文件数以信息级说明附在 Codex note 后(「Codex 会话文件读取失败 N 个, 本轮沿用上次结果或暂未计入, 下次刷新重试」,经 C198 的 LOCAL_SOURCE_NOTICE,不把 Codex 置错误)。实测(临时 home,Bruce-collector):rollout chmod 000 一轮后恢复权限,修复前连续两轮仍为 0、缓存条目 observations=0;修复后失败轮不写缓存,恢复后下一轮即回到 1,050。本机真实 ~/.codex(41 个会话)182 天合计修复前后一致(310,202,004),冷 / 热扫描耗时不变。C197 之前已写成空条目的会话不会自愈(本机核查 0 例)。
  • 来源说明不再被当成故障:Codex 缓存自愈与会话副本取舍不再显示错误 (C198):collector 此前把来源层的任何说明都按 LOCAL_SOURCE_SCHEMA_INCOMPATIBLE 输出并把 agent 置 error——Codex「缓存文件格式异常, 已整体重建」(用量完整、自愈)那一轮、以及 Orca 旧前缀副本触发的「会话副本内容冲突」每一轮,Codex 都显示错误、envelope 为 Partial。现在来源结果分故障(diagnostic:SQLite 库不可读 / schema 不兼容 / 查询失败,语义不变)与说明(notice)两个通道,说明以新的信息级诊断码 LOCAL_SOURCE_NOTICE 输出,不改变 agent 状态、不参与 Partial 判定,文字附在 agent note 后(如「额度见下方 Codex 账号 (实时查询) (Codex 缓存文件格式异常, 已整体重建)」)。Windows 用量卡同步修正:此前以 status != "ok" 判定,把 T26 的 history(台账历史)也报成故障,现与 mac 一致排除 history。实测(临时 home,Bruce-collector):损坏 Codex 缓存后 Codex ok、1,050 不变、envelope success;ZCode 库损坏仍为 error + LOCAL_SOURCE_SCHEMA_INCOMPATIBLE。
  • 出口IP检查线路测试不匹配改为红色警示并保留上次结果 (C184):设置中心出口IP检查卡片此前用包含关系判断测试结果,导致「出口国家不匹配」也被当成「匹配」显示绿色;现在状态点与文案精确区分:探测匹配绿色、国家不匹配红色警示、探测失败/无法识别黄色。测试结论与脱敏地址持久化到国家组,重新进入设置可恢复,端口变更时自动重置。