Skip to content

Releases

Bruce v0.17.0

Choose a tag to compare

@github-actions github-actions released this 06 Nov 02:54

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);国内直连 / 探测失败 / 出口未知 / 配置无效保留各自原因文案,状态预警气泡徽标文案不受影响。
  • **菜单栏图标高级重构:德系包...
Read more

Bruce v0.16.0

Choose a tag to compare

@github-actions github-actions released this 02 Nov 02:08

Bruce 0.16.0 发布说明

调整与优化 (Changed)

  • 采集请求退役 localScanSeconds (C177):该超时字段只被校验、从未生效(本机扫描一直只受整轮 moduleSeconds 约束),mac 与 Windows 不再发送;Collector 仍兼容接受旧请求中的该字段。设计文档登记两端各自的超时预算(mac 90 / 10 s,Windows 150 / 30 s)。

修复 (Fixed)

  • Windows 前端安全加固 (C178):Windows 应用的看板、设置、悬停预览与额度预警窗口启用严格内容安全策略(只允许加载应用自带脚本,不允许内联脚本与远程资源);每个窗口只能调用它实际用到的后端命令(例如预警气泡只能收起自己或唤出看板,不能触碰凭据或更新安装),两个没有界面入口的凭据写入命令不再对任何窗口开放。预警气泡显示服务名等字段前做转义。界面与功能不变。
  • 本机采集内存与缓存体积大幅下降 (C176):Collector 扫描 JSONL 会话时改为逐文件聚合,不再把全部观测同时留在内存;缓存条目改为紧凑格式(项目名按文件存一次、模型名按文件去重、去重键缩短、字段名缩写)。2,000 个 Claude 会话(40 万条观测)的热扫描峰值内存由 251 MB 降到 57 MB,缓存目录由 102 MB 降到 39 MB,热扫描由约 0.6 s 降到约 0.36 s,统计结果逐字节不变。升级后首轮会重建一次缓存。
  • 本机冷扫描提速约 4 倍 (C175):Collector 写可再生缓存时不再逐条目强制落盘(macOS 上每条一次 F_FULLFSYNC)。2,000 个 Claude 会话(289 MB)的冷扫描由 18–20 s 降到约 4 s,产出逐字节一致;版本升级后全量重建缓存不再逼近 90 s 的整轮预算。掉电后若缓存条目为空或被截断,下一轮按损坏重建,统计结果不受影响。
  • mac 软件更新校验发布签名 (C174):mac 应用内更新此前只比对与安装包同源的 SHA256,随后剥离隔离属性,替换 Release 中的 Bruce.zip 与 latest.json 即可推送任意代码。现在安装前以内置公钥校验发布签名(与 Windows 更新同一把密钥,发布门禁断言两端一致),签名缺失或不通过时拒绝安装并提示「签名校验不通过」,不解压、不剥离隔离属性。已发布的 v0.15.0 安装包的真实签名可通过校验。发版作业本身被利用时签名仍会通过,这一残余风险不变。
  • 删除订阅凭据后不再残留在备份文件 (C173):mac 删除账号时,被删的密钥此前会作为「上一版」留在 credentials.json.bak,直到下一次改配置才被覆盖。现在删除后主文件与备份都不再含该账号;凭据文件损坏时留下的现场副本只保留最近一份。
  • Windows 保存 Claude 刷新后的新令牌 (C172):Windows 版此前只回写 StepFun 的新令牌,Claude 订阅额度刷新换得的新令牌被直接丢弃,访问令牌一过期就只能重新导入登录态。现在与 mac 同口径写回(包括本轮采集失败时带回的新令牌),自动跟随本机 Claude 登录态的账号首次刷新后会自动保存;两端合并结果由共享对拍用例锁定。
  • 订阅额度刷新换得的新令牌不再随失败丢弃 (C171):Claude 与 StepFun 的刷新令牌是一次性的,刷新成功后服务端即作废旧令牌。此前若紧接着的额度查询失败(如 429 限流、5xx、网络错误或超时),或本轮本机扫描失败 / 超时,新令牌没有写回,下一次刷新只能失败并要求重新登录。现在刷新成功即保留新令牌:查询失败的结果与整轮失败的错误响应都会带回新令牌,mac 先写回凭据再决定是否发布本轮结果;mac 采集外层超时也改为晚于采集进程自身的截止时间(默认 90 → 102 秒),确保到期时的响应能送达。另修复 mac 首次为本机 Claude CLI 登录态保存新令牌时写成采集进程读不到的格式,导致下一轮仍用已作废的旧令牌。Windows 侧的 Claude 写回见 C172。
  • CI 验证作业补齐 ripgrep 依赖 (C170):push 级「本地验证套件」在 macOS runner 上因缺少 ripgrep 失败——check-bundle-resources.zsh 把「命令不存在」误判成「打包脚本未调用共享资源函数」,报错与事实相反;check-collector-fixtures.sh 则静默跳过 fixture 凭证扫描(rg 未执行也输出通过)。CI 验证作业显式安装 ripgrep,两个脚本改为先 command -v rg 预检并明确报错,新增 check-ci-tool-deps.mjs 契约检查守住 CI 安装与脚本预检的一致性。
  • 正式版打包补装 Nothing 主题字体 (C168):Developer ID 正式版脚本 build-release-app.sh 此前漏拷 Assets/Fonts,用它打出的包在 Nothing 主题下会静默回退为系统字体(当前 CI 发版走 build-test-app.sh,已发布版本不受影响)。两个打包脚本改为共用 runtime-manifest.zsh 的同一份资源清单投放并校验,本地验证新增 check-bundle-resources.zsh 防止再次漂移。
  • mac 自定义刷新间隔点别处即保存 (C167,修正 C160):设置页「刷新间隔 · 自定义」输入后点击别处或切走窗口即生效(此前只认回车,点别处后数字仍显示在框里却没有保存);非法输入回到当前生效值,未改动时不重启刷新计时。
  • Agent / 模型品牌徽章补漏 (C166,修正 C161):Windows 端补登记 Cline 模型图形(此前 Cline 模型在 Windows 仍显示色点,mac 已是徽章);Windows 真彩位图加载失败时改为显示矢量图形或字标,不再留下空白徽章;mac AgentBrandBadge 消除编译告警。两端品牌表新增共享对拍用例 tests/fixtures/agent-brand-parity,防止再次各改各的。
  • 模型用量时序趋势图缩放 / 平移 / 刻度修复 (C165,修正 C162 / C163):
    • 不再劫持页面滚动:鼠标悬停在图表上时,普通滚轮照常滚动设置页;缩放改为 mac ⌘ + 滚轮或触控板捏合、Windows Ctrl + 滚轮或触控板捏合,放大后水平滑动或拖拽平移;
    • mac 捏合不再一捏到底:捏合倍率相对手势起点计算,此前叠乘导致轻捏即跳到 4.0x 或 1.0x;缩放统一以视口中心为锚点;
    • Windows 拖拽:一次拖拽可连续平移(此前只能移一格);点击两次后不再卡在拖拽态导致悬停探针失效;后台刷新不再把缩放复位,只有切换时间范围才回到全景;
    • 刻度:按可见点数选 1 / 2 / 3 小时步长并锚定整点,平移时标签随数据移动;轻度放大不再退化成 4 小时步长;🔥 峰值胶囊两侧相邻刻度都会让位,不再与相邻标签贴住;
    • 费用维度:🔥 胶囊与底部峰值 / 均值摘要改按费用计算,此前标的是 token 峰值;
    • 刻度与视口计算新增双端共享对拍用例 tests/fixtures/timeline-axis-parity。
  • 订阅额度自动查询最短 3 分钟 (C164):C160 允许把刷新间隔设到 1 分钟后,订阅额度接口会跟着每分钟被查询一次,容易触发 429。现在额度查询周期取「刷新间隔」与 3 分钟中的较大值(双端共用 collector-policy 门禁,跳过回填的 fresh / stale 标注同一口径),本地 Token 统计仍按所选间隔采集;手动刷新、单 Provider 定向刷新与窗口重置后的重查不受此限。设置页「刷新间隔」说明同步注明。
  • 设置中心「模型用量 · 时序趋势」X 轴拥挤修复与峰值胶囊高亮 (C162):
    • 修复分类轴全量挤占:修复 macOS Swift Charts 对 String 离散分类轴忽略 .automatic(desiredCount:) 导致今日 24 小时及近 30 天全量标签首尾紧贴、边缘被截断为 00:... / 23:... 的问题,改为通过 WorkbenchAnalytics.timelineAxisTicks 显式传入刻度集合;
    • 方案 A1 等步长 + 防撞吸附:今日 24 小时采用 3 小时严格等步长(00:00, 03:00 ... 21:00),长周期按固定步长采样并收口末点;非网格峰值点若距最近基准刻度 $\le \text{minGap}$ 则自动替换邻近刻度防撞,否则追加;
    • S2 峰值胶囊徽章(双端同构):X 轴峰值刻度渲染为 🔥 <时刻>(如 🔥 15:00)圆角胶囊徽章,文字与半透明胶囊底/细边框自动跟随峰值处主导曲线系列色(Agent / 模型 / Token 构成 / 费用切换时实时同步)。

新功能 (Added)

  • 更新 GPT-6.1 系列模型官方基准定价 (C169):

    • 更新 OpenAI GPT-6.1 系列模型定价:gpt-6.1-sol 调整为 $2.00 输入 / $10.00 输出 / $0.10 缓存读取;补齐 gpt-6.1-terra($1.00 输入 / $5.00 输出 / $0.05 缓存读取)与 gpt-6.1-luna($0.10 输入 / $0.50 输出 / $0.01 缓存读取);
    • config/pricing-catalog.json 事实源、macOS BuiltinModelPricingCatalog、Windows model_catalog 与 Rust Collector 计费引擎全链路锁定与同步对齐。
  • 模型价格表远端同步与维护页卡片 (T19–T21):

    • 价格表抽离与动态价卡契约 (T19):内置模型价格表从代码深层解耦至顶层 config/pricing-catalog.json,补充 schemaVersion 与 updatedAt 元数据;Collector 核心实现 parse_and_validate 校验与 PricingTable::with_catalog 动态构造,支持通过 context.pricingCatalog 动态注入,并严格校验版本防倒退与格式完整性;
    • macOS 远端同步服务与维护页卡片 (T20):BruceAppCore 实现 PricingCatalogSyncService,支持后台按计划自动拉取远端价格表、SHA256 哈希完整性校验、原子更新与故障回滚;设置中心维护页新增「模型价格表」状态卡片,展示当前版本、发布日期与「立即同步」操作入口;新增 PricingCatalogSyncHarness 自动化验收套件(12 项测试,51 条双端对齐断言全绿);
    • Windows 远端同步与维护页卡片 (T21):Windows 端 bruce-win-viewmodel 与 Tauri 后端实现动态价卡读取、远端同步状态同步与维护页交互对齐;跨端单元测试、集成测试与前端对拍测试全部通过。
  • 模型用量时序趋势图手势缩放、水平平移与动态 LOD 刻度步长自适应 (C163):

    • 手势交互与双端同构:设置中心「模型用量 · 时序趋势」折线/面积图支持鼠标滚轮滚动(向上放大、向下缩小)与触摸板双指捏合缩放(1.0x ~ 4.0x),并在放大后支持水平左右拖拽平移视口;
    • 快捷缩放控制组:顶部操作栏集成紧凑型 [−] 1.0x [+] 缩放按钮组;放大或平移时右上角浮现 ↺ 全景 复位按钮,双击图表区域亦可一键复位;
    • 动态 LOD 分级刻度自适应:基于视口切片模型(Slicing Viewport Model),全景(>18h)保持方案 A1 3h 严格等步长,中度放大(10h~18h)自动细化为 2h 等步长,深度放大(≤10h)展开逐 1 小时全量刻度;
    • 峰值跟随与手势探针解耦:全局最大峰值仅在当前视口包含该时刻时高亮显示 🔥 <时刻> 系列色胶囊(移出视口不产生虚假峰值);拖拽平移期间自动隐藏竖线探针与 tooltip 避免抢占焦点;图表底部提供 2pt 视口指示条实时呈现可视时间段在全周期中的绝对位置。
  • Agent / 模型身份升级为品牌徽章 (C161):

    • 真彩优先:设置「Agent 表现」行首、归并模型行、模型 chip、时间线图例与仪表盘「Agent 用量」图例/逐小时行的色点,全部换成品牌徽章——有官方 App 位图的用真彩(ZCode / Codex / CodeBuddy),其余用品牌底色 + 官方图形(Claude clay 标记、Kimi、OpenCode、Grok);
    • 逐档降级:≥14pt 走真彩档并带 1.2pt 系列色环,保留「图表色 = 哪个 Agent」的映射;<14pt(模型 chip)落系列色瓷砖 + 白图形,避免位图缩糊;无素材退字标(Pi 的 π),Nothing 主题保持单色方角 + 绿阶档色;
    • 模型顺带消歧:模型 chip 改为厂商图形,消掉 glm=ZCode、gpt=Kimi Code CLI、kimi 模型=Codex 的撞色歧义;未登记厂商仍保留原色点;
    • 素材纪律:位图取自本机已安装应用内置图标并登记 SOURCES.json,生成器统一投放双端运行时目录并纳入 --check 字节比对;图表折线、堆叠柱、占比条配色一行未改。
  • 刷新间隔预设与自定义、移除测试气泡入口 (C160):

    • 预设收敛:设置页刷新间隔由 5/15/30/60 分钟四挡改为「3 分钟 / 6 分钟 / 自定义」三项;
    • 自定义分钟:自定义值默认只读显示「X 分钟」并提供「编辑」入口,点击分段或「编辑」后才展开数字输入并聚焦;合法区间 1–1440 的整数分钟,超出区间或非整数输入还原为当前生效值且不写盘;打开设置时不再有输入框抢占初始焦点;
    • 历史值不丢:既有的 5/15/30/60 等非预设值回显为「自定义」并保留原值,未配置仍默认 30 分钟;
    • 测试入口退役:移除 macOS / Windows 设置页「额度预警气泡」行的「测试气泡」按钮及其 mock 触发通道。
  • 订阅额度预警由系统通知升级为双端图标锚定气泡 (C159):

    • 交互升级:全面退役操作系统系统通知弹窗(UNUserNotificationCenter 与 Windows Toast);额度紧缺时在 macOS 菜单栏图标及 Windows 托盘正下方弹出轻量非激活无焦点微卡气泡(280pt 方案 A,鼠标悬停常亮,6s 静默淡出,点击直达主看板,不打断前台键入);
    • 三档阶梯与倒计时:升级为 [50%, 80%, 95%] 三档阶梯评定与跨档去重,支持 R3-A 电子表秒级倒计时跳动与用量平滑增长弹簧动效;
    • Nothing 极客点阵与全主题适配:深度适配 Nothing 主题(点阵字体、14 段方块点阵迷你进度条、方正微卡与高对比度边框)与经典/Fluent 毛玻璃圆角卡片;
    • 排版防折行与零空格:周期标签规范为「每5小时」零空格 Chip,声明 .fixedSize() 刚性约束并提升排版优先级,杜绝长服务名下的意外折行;
    • 设置项:原「系统通知」平滑演进为「额度预警气泡」并复用配置键。
  • 订阅卡空状态与 Tab 回退修正 (C157):

    • 两态空态:未配置任何仪表盘可见订阅时订阅卡不再整张消失,显示「未配置」空态(尚未添加订阅 → 添加订阅);已有启用且验证通过的订阅但本次采集没有返回额度时显示「无数据」空态(暂未获取到额度 → 刷新额度)。仅添加未验证、验证失败、需重新登录、已停用与临时屏蔽的 Jev 一律归入未配置,不引入第三态;
    • Tab 不再错卡:Tab 模式选中订阅页签时显示空态卡,不再回退成 Token 用量卡;
    • 直达配置:「添加订阅」直接打开设置「订阅额度」页(macOS SettingsWindowController.present(category:);Windows 经同源 localStorage 深链,打开失败自动撤回);
    • 双端同构:判定口径、文案、虚线空位框与折叠行为 macOS / Windows 一致。
  • 额度条与余额数字的更新动效 (C158):

    • 量条:刷新带来的用量变化从旧值增量过渡到新值(0.85s 临界阻尼弹簧,零过冲),三档颜色交叉淡入,增长时右缘高光加一次扫光;Nothing 分段逐段点亮,动画期前沿段提亮;
    • 数字:百分比与量条同拍逐位滚动,可用余额与 Credits 胶囊 0.6s 逐位滚动;-- 占位与首次出现不滚动;
    • 门控:面板隐藏、动效总开关关闭或系统减弱动态效果时全部直接落值,时长 / 曲线 / 门控由 MeterMotionPolicy 单点裁决;
    • Windows:全量重建 DOM 后按稳定 key 用 Web Animations 从旧值补间,数字列静止态与改动前逐像素一致(真实 Chromium 内核对拍无几何差异)。

Bruce v0.15.0

Choose a tag to compare

@github-actions github-actions released this 29 Oct 08:57

Bruce 0.15.0 发布说明

新功能 (Added)

  • 双端仪表盘物理卷轴抽屉展开动效 (C137):

    • macOS 端:以菜单栏图标为顶边固定锚点,自顶向下展开至目标高度(240ms cubic-bezier(0.16, 1.0, 0.3, 1.0) 阻尼曲线),内容采用低优先级垂直约束避免挤压形变,逆向回卷(140ms easeIn)后隐藏并归还焦点;支持 Reduce Motion 降级与连击打断保护;
    • Windows 端:通过 CSS clip-path 与硬件加速 transform 实现任务栏托盘侧物理卷轴展开(260ms)与逆向回卷收拢(140ms),并在 transitionend 后触发后端隐藏。
  • 全局界面动效总开关 (C145):

    • 单一裁决源:新增 MotionPreference(跟随系统 / 始终播放 / 始终关闭,默认跟随系统),解析规则唯一:suppressed = (never) ‖ (system ∧ 系统减弱动态效果);macOS 收在 OnboardingCoordinator.motionSuppressed,Windows 收在 app.js 的 motionSuppressed();
    • macOS 全覆盖:SwiftUI 的 \.accessibilityReduceMotion 为只读环境值无法覆盖,故自建可写环境键 \.motionSuppressed,在仪表盘面板与设置窗口两个宿主根注入,统一受控 19 处 withAnimation、5 处 .animation()、菜单栏刷新指示环与卷轴开合过渡;系统设置在运行中变更经 accessibilityDisplayOptionsDidChangeNotification 即时重算;
    • Windows 全覆盖:AppSettings.motionPreference 驱动 <html data-motion>,CSS 以 html[data-motion="off"] 全量闸门替换原 prefers-reduced-motion 媒体查询与 JS 判据的双重裁决,系统设置在运行中变更经 matchMedia change 事件重算;
    • 卷轴缓动曲线修正:展开曲线由 cubic-bezier(0.16, 1.0, 0.3, 1.0)(前 45ms 即走完 74.5% 行程,视觉等同瞬移)改为 cubic-bezier(0.22, 0.61, 0.36, 1),起始不透明度改为 0。
  • 订阅多账号自定义名称 (T18):

    • 默认名:新建账号统一使用「<Provider> · 账号 N」,N 为该 Provider 内最小未占用序号;Codex 优先用邮箱前缀。新名称不再写入 API Key 前 8 位,消除 Key 前缀泄漏与不可读哈希;存量账号不自动改名;
    • 重命名:macOS 三处账号列表(API/Kimi/DeepSeek/火山/智谱/StepFun/Jev/Cline 配置对话框、通用订阅外壳、Codex 账号区)与 Windows 账号行均提供入口,只编辑标签,Provider 前缀、accountID、凭据与 collector service ID 不变;空输入恢复默认名,同 Provider 重名就地拒绝;
    • 保存安全:重复粘贴同一凭证或令牌轮换不覆盖自定义名;StepFun 换站点时保留标签、仅重建站点前缀;站点判定改为名称开头的精确前缀,自定义标签里的「国际」不再误判站点。

修复 (Fixed)

  • 面板滚动/回弹后内容高度与窗口高度失步 (C147):
    • 高度单一真源:控制器记录 lastContentSize / pendingContentSize,过渡中或隐藏时上报的尺寸不再丢弃,动画结束与面板重新可见时补应用一次;打开面板优先用最近上报值而非 fittingSize;
    • 顶边锚定与屏幕夹取:窗口 frame 统一经 DashboardPanelSizingPolicy,顶部不高于 visibleFrame.maxY − 8、底部不低于 minY + 8,内容超高时压缩高度;
    • 宿主视图锚定:hostingController.view 改为显式 required 高度约束,并在每次窗口尺寸落定后 realignContentToTop,内容只向下溢出被视口裁切,不再整体平移;
    • 测量稳定:卡片栈高度上限由计算属性改为视图缓存值,在出现、面板重新可见与屏幕参数变更时刷新,滚动/开合期间不再随键盘窗口抖动。
  • 凭据存储「配置」不再是死按钮 (C156):
    • 该按钮自 C001 起只调用 configureKeychainAccess()(写配置、无界面),已配置用户点下去界面毫无变化,被判定为「点了没用」;
    • 现改为打开「凭据存储」面板:显示当前状态(已配置 / 未配置 / 访问被阻断)、存储位置与 0600 权限说明,点「重新配置」才执行写入;首次未配置的自动引导复用同一面板的解释文案。
  • Windows 启动或看板显示失败时用户拿不到任何线索 (C150):
    • 不再静默退出:初始化失败原以 expect 直接结束进程,发布版又关闭控制台,用户只看到程序一闪而过。现改为按固定阶段码弹出原生提示(TAURI_INIT_FAILED / DASHBOARD_WINDOW_MISSING / DASHBOARD_SHOW_FAILED),不依赖 WebView 是否创建成功;
    • 看板显示失败不再被丢弃:show 返回错误此前被忽略,现在分类为可见故障;焦点获取在窗口已显示后仍保持非致命,不把 Windows 前台激活策略的限制误报为启动失败;
    • 诊断内容收敛:提示只由阶段码生成,不包含原始异常文本、完整路径、账号或凭证;一次性闸门保证失败不会反复弹窗或递归报错。
  • Windows 本地打包失败仍可能复制旧产物并报告成功 (C151):
    • 退出码逐条检查:cargo install / cargo tauri build / cargo build 失败即停止,不再继续走到复制与 SHA256 步骤;
    • 产物按下标而非时间挑选:原先按目录内最新 LastWriteTime 取安装包,增量构建复用未改写文件时会选错版本甚至拾取上一轮残留;现按 tauri.conf.json 的 productName / version 与目标架构精确匹配文件名,缺失即非零退出;
    • 目标与目录显式化:构建目标取自 CARGO_BUILD_TARGET 或 rustc -vV 的 host 并显式传参,中间产物默认收拢到 local/build-win/cargo-target,越出 local/ 的 CARGO_TARGET_DIR 直接拒绝;
    • 签名残留拦截:--no-sign 构建遇到 local/dist 中同名旧签名时先失败,避免把旧签名与新安装包混搭;
    • 回归固化:新增 scripts/tests/test-build-win-app.ps1 故障注入行为测试并接入 CI verify-windows。
  • Windows 启动后没有可见入口、重复启动只多一个静默进程 (C149):
    • 启动即呈现面板:三个窗口此前全部 visible: false 且启动不显示任何窗口,用户双击快捷方式后只能自己去找托盘图标(Win11 新装应用的图标默认收进溢出区,而默认热键为空)。现 setup 末尾经统一入口呈现看板,双击启动即视为一次显式唤出;
    • 单实例:接入 tauri-plugin-single-instance(首个注册),第二次启动唤出既有面板后退出,不再起第二个无声无窗口的进程;
    • 统一唤出入口:托盘左键/托盘菜单/热键/预览卡展开/启动呈现/第二次启动统一走 reveal_dashboard(先 record_shown 再 show),修正预览卡展开漏记显式唤出、导致不参与 180ms 瞬态失焦保护的不一致;
    • 悬停预览卡事件授权:preview 窗口此前不在任何 capability 内,event.listen 被静默拒绝,420px 预览卡收不到 dashboard-updated。新增最小权限的 preview-panel capability,并在 check-win-frontend.mjs 增加「订阅事件的窗口必须有 listen 授权」的结构断言(缺授权即 CI 红灯);
    • 结构门禁修复:check-win-frontend.mjs 的提前退出位于 T11 结构断言之前,那些 FAIL 只打印不影响退出码,现把退出判定移到全部断言之后。
  • macOS 仪表盘展开/收起与 Tab 切换的弹簧抖动 (C148):
    • 面板高度单一动画源:内容高度变化统一折算成一次 0.30s easeInOut 窗口高度动画,同拍多条上报先经 30ms 合并成一个目标(此前每条上报各起一条 0.20s 窗口动画,反复重新起步读作弹簧回弹);宿主视图改为四边贴合窗口、根视图去掉 fixedSize,视口弹性伸缩,底栏随窗口下边缘同步移动,消除「底栏先跳到位、窗口边缘追赶」的错位与底部空壳帧;
    • 交换态显式高度:卡片正文、多账号段与 Tab 单卡改为 ZStack + 实测自然高度 + 显式 frame 插值(新增 DashboardSwapHeight 裁决),Tab 切换去掉 spring(damping 0.82) 过冲曲线,高度不再先冲高再缩回;屏高上限收敛到 DashboardPanelSizingPolicy 夹取,删除视图内的 maxStackHeight 缓存;
    • 标题行折叠交接:拖拽手柄常驻、占位宽度随折叠态插值(展开 0 宽),收起摘要与「最后更新 / LIVE」改为接力淡入(退场 0.07s、入场延迟 0.06s),消除标题横向跳动与文字压在量条上的叠影。
  • macOS 构建源码告警清零 (C140):
    • 跨模块主题类型导入:ProviderBrandBadge 显式 import BruceOnboardingCore,不再依赖 BruceAppCore 的传递可见性引用 ResolvedTheme,消除 Swift 6 implementation-only 可见性告警;
    • WebKit Cookie 清理时序:StepFunWebLoginView 清空登录缓存改用 await cookieStore.deleteCookie(_:),全部 Cookie 删除完成后再重载页面,消除 async 替代告警并修正清理与重载的并发竞态。
  • 构建源码告警清零(第二批)(C143 / C144):
    • 滚动条压制观察隔离 (C143):KVO 与通知回调改经 nonisolated 入口建立主线程语义(主线程 MainActor.assumeIsolated 同步压制,异线程交主队列),deinit 直接释放 KVO 观察与通知 token,不再调用 MainActor 隔离方法;
    • 设置下拉与测试卫生 (C144):ProviderPopUpPicker.Coordinator 标注 @MainActor,与 SwiftUI 协调器契约一致;NativeLifecycleHarness 的取消退出用例补断言「存在运行任务时先安排宽限期回调」,消除死变量。

调整与优化 (Changed)

  • 技术债批次收口 (C130–C136):
    • TD-003/006 总账校准 (C130):Windows Provider 清单与四处巨型文件切分均已由既有实现落地,从远期债务池移除;
    • TD-008/010 边界定稿 (C131):旧格式凭据迁移只在 macOS 侧发生(Windows 无历史格式);collector-credential 只读探测函数定位为测试/兼容面,并写入设计 02;
    • TD-012 滚动条压制事件化 (C132):面板滚动条压制由 0.3s Timer 轮询改为 KVO + 系统通知事件驱动,隐藏/离窗即解除观察;
    • TD-009 菜单栏额度门禁 (C133):菜单栏「最低/平均剩余额度」与仪表盘共用验证门禁,未验证 Provider 不再影响菜单栏;
    • TD-004 缓存原语收敛 (C134):JSONL / SQLite 缓存与 Codex 头尾指纹统一到 collector-local::cache_util,原子写盘补 sync_all;
    • TD-011 Windows 设置前端拆分 (C135):settings.js 由 3,258 行拆分为共享状态 + 订阅 / 工作台 / 计费 / 维护分节脚本 + 56 行壳层,脚本按 settings.html 固定顺序加载;
    • TD-005 重试契约通用化 (C138):codexQuotaRetryOnly 改为通用 quotaRetryOnly,额度计划一律经 build_account_plan,删除 codex 专属编排入口,并补非 codex provider 的重试回归;
    • TD-002 峰谷/分档计价 (C139):TokenBucket 增加计价类别份额,DeepSeek V4 Pro 峰值 00:30–16:30 UTC 按 $1.32/$3.96、Qwen3.7 Plus 单请求 >256K 按 $1.20/$4.80 计费;SQLite/JSONL 缓存保留份额并升聚合版本。
  • 设置页去除冗余说明文字 (C146):
    • 开关状态字移除:macOS 通用页「锁屏暂停订阅刷新」「系统通知」与 Windows 维护页「系统通知」不再在开关旁渲染「已开启 / 已关闭」,开关开合位置即唯一状态表达(改写 C112 §5 的居左状态字契约);
    • 软件更新卡去噪:「自动检查更新」行去掉状态字;「当前版本」行去掉「正式版 · 从 GitHub Releases 检查 (...)」频道小字(dev 构建的降级小字同步移除),只保留等宽版本值;UpdateCopy / update-presentation.js 与共享 fixture tests/fixtures/update-copy-parity/cases.json 同步删键。
  • 设置窗口侧栏改按窗口宽度锁定比例 (C152):
    • 比例锁定:侧栏由固定 216pt 改为窗口内容宽度的 17.6%(1000pt 窗口下 176pt、右侧面板 823pt),窗口缩放时左右比例保持不变,160pt 为长标签可读性下限;macOS 统一由 BruceAppCore.SettingsWindowMetrics 计算,Windows .sidenav 以同比例 CSS 表达;
    • 默认尺寸:设置窗口内容区默认 1040×680 → 1000×680(mac setContentSize 与 Windows tauri.conf.json 同步),最小 980×620 不变,仍可自由缩放——锁定的是比例而非长宽;
    • 回归护栏:新增 SettingsWindowMetricsHarness(默认尺寸 / 多宽度比例恒定 / 比旧值收窄 / 单调增长 / 非法输入兜底),Windows frontend.test.mjs 增补侧栏比例与窗口可缩放断言。
  • 设置通用页配置项按功能分组重排 (C153):
    • macOS 行序:配色模式 → 界面风格 →(模糊风格)→ 界面动效 → 仪表盘卡片布局 → 刷新间隔 → 锁屏暂停订阅刷新 → 系统通知 → 凭据存储 → 外部 CLI 来源,外观类(含动效)聚在前,再看板呈现、刷新行为,最后通知与凭据安全;
    • Windows 同构:界面风格 → 界面动效 → 看板布局 → 刷新间隔 → 系统通知,与 mac 去掉平台独占行后的相对顺序一致;
    • 回归护栏:frontend.test.mjs 新增通用页行序源码断言,并把「设置保存串行化」用例从分段控件下标定位改为按 setting-interval id 定位,避免行序变动造成误报。
  • 凭据存储行去掉重复状态表达 (C154):
    • 已配置态不再渲染绿色「已配置」文字,只保留主按钮;按钮文案由「重新配置 / 配置 / 修复」统一为「配置」,三态共用同一处置入口;
    • 「未配置」「访问被阻断」两条需要用户处置的警示仍保留(warn 黄字,紧邻按钮)。
  • 设置窗口行内按钮统一颜色与尺寸 (C155):
    • 凭据存储行的「配置」由主按钮改回中性次按钮,与订阅额度行的同名「配置」一致;主按钮只保留给区块级主动作(「添加…」「确认授权」)与对话框确认,危险操作仍用 danger;
    • FluentButtonStyle 为非 link 角色加 64pt 最小宽度并居中,短标签按钮(配置 / 管理 / 预览 / 导出 / 录制 / 清除)等宽,行尾控件成列对齐。

Bruce v0.14.0

Choose a tag to compare

@github-actions github-actions released this 27 Oct 15:48

Bruce 0.14.0 发布说明

新功能 (Added)

  • 额度策略请求 / 响应契约 (T14):新增 schemas/policy-request-v1 / policy-response-v1,额度门禁与回填的入口只接收订阅服务列表与时间等纯数据,拒绝未知字段与任何凭据形态的字段,错误以诊断码返回。该契约先以 Bruce-collector policy 子命令提供给 macOS,T16 起改为 App 进程内调用,子命令在同一版本内退役。
  • macOS DMG 磁盘镜像安装包支持与 CI/CD 自动发布 (C114):
    • DMG 打包工具脚本 (package-dmg.sh):新增 scripts/package-dmg.sh,将 Universal 2 架构的 Bruce.app 与 /Applications 软链接封装为带卷名 Bruce 的标准 UDZO 压缩 DMG 磁盘镜像,便于用户首次下载后开箱即用、一键拖拽安装;
    • 本地构建联动:scripts/build-test-app.sh 与 scripts/build-release-app.sh 支持 --dmg 参数,可在组装完成 Bruce.app 与 Bruce.zip 后同步产出 dist/Bruce-<version>.dmg;
    • CI/CD 流水线附加资产与校验和:.github/workflows/ci.yml 的 build-release-app 与 release 作业接入 --dmg 构建与镜像完整性校验,并将 Bruce-<version>.dmg 纳入 SHA256SUMS 和 Release 上传清单,与应用内更新依赖的 Bruce.zip 资产并存。
  • Windows 系统托盘动态配额环与 420px 亚克力微缩实时预览卡 (T12):
    • 托盘动态配额环与状态指示:Rust 后端基于聚合快照与视图模型,实时提取最紧俏 Provider 剩余百分比与四色健康状态灯(翠绿/琥珀/科技红/离线灰),纯数学内存绘制 32×32 动态透明配额环图标,动态同步托盘原生 Tooltip(Bruce · 额度剩余 XX% · 运行正常 | 今日 $X.XX);
    • 420px 亚克力微缩实时预览卡:在任务栏托盘悬停时弹出无边框、卡片级圆角(12px)、半透明 Fluent 亚克力(Mica/Acrylic)微缩子窗口;展示 42px 环形仪表、滑动窗口重置倒计时、今日费用/Token 以及活跃 Agent 状态点阵;
    • 优雅调度与互斥保护:当主看板已打开时鼠标悬停托盘静默不唤起微缩卡,避免窗口重叠争抢;微缩卡失焦、移出鼠标 350ms 或按 ESC 平滑淡出自动隐藏;点击微缩卡内「展开完整看板」一键无缝唤起主面板;
    • 设置中心开关联动:设置中心「通用」面板新增「托盘实时预览」开关(状态居左、开关居右),支持自由开启/关闭悬停弹出,配置即时持久化。

修复 (Fixed)

  • 测试版打包冒烟恢复可用 (C129):C116 改写本机缓存格式后,打包脚本里的「旧缓存重建」冒烟仍按旧文件格式查找 Kimi 缓存条目,scripts/build-test-app.sh 与 CI 的测试版构建在组装完 App 后恒失败;冒烟改为按新格式定位条目并验证旧版本条目会被重新解析。采集端行为不变。
  • macOS 凭据存储说明更正 (C127):订阅凭证保存在本机凭据文件(~/Library/Application Support/Bruce/credentials.json),但多处界面仍称「Keychain / 钥匙串」——写入或删除失败时提示「请在 Keychain 中手动检查」会让人去钥匙串里找不存在的条目。界面文案、错误提示与无障碍提示统一改为「本机凭据文件」,配置对话框说明与 Windows 逐字一致,设置页「钥匙串访问」改为「凭据存储」并如实说明旧版钥匙串凭证的自动迁移。
  • 未配置订阅时不再显示「部分失败」(C124):没有任何订阅凭证(或未同意云端授权)时,采集端此前仍输出两条「CC Switch 云端额度」/「Codex 账号额度」占位,使每一轮纯本机统计都被判为部分失败(Windows 状态灯恒为琥珀色);现不再输出占位。同时更正 Claude Code 行「当前经 CC Switch 路由」与桌面小组件「经 CC Switch 查询 / 按 CC Switch 定价表估算 / 每 30 分钟刷新」等过时说明。
  • macOS 每轮刷新的主线程卡顿降低约 90% (C121):保存与读取用量快照时不再把同一份数据反复整体解析与校验(此前每轮约 0.3 秒主线程耗时,界面会短暂卡顿),本机真实快照实测保存 192 ms → 17 ms、读取 71 ms → 0.2 ms;不再额外写一份与上一份快照相同的备份文件。
  • macOS 新启用的订阅立即查询额度 (C120):macOS 只检查上一轮已有数据的订阅,重新开启的订阅要等其他订阅到期才会首次查询(最长一个刷新间隔);现与 Windows 一致按当前启用的订阅逐个判断,新启用的立即查询,已停用订阅的旧数据不再触发查询,没有启用任何订阅时不再发起额度请求。两端的判定改由同一份共享用例校验。
  • 移除恒为占位的 Orca 行 (C119):Orca 内置 Codex 的会话一直计入 Codex 行,Orca 行因此恒显示「未发现会话记录」;现删除该行。Windows 设置页会话探针同步删除 Orca 行,并在 Codex 行注明含 Orca 内置 Codex。
  • 订阅限流与 provider 归属改读显式字段 (C118):collector 为每条订阅服务显式下发 provider 与 failureKind(此前仅 Codex 带 failureKind),mac 与 Windows 的 429 冷却记账与 provider 归属改读这两个字段,不再从 service id 前缀推断 provider,也不再在提示文案里查找「429 / 限流」;旧版本落盘的 artifact 缺少字段时回退原推断,升级后冷却状态不丢失。
  • Codex 缓存按文件复用 (C117):Codex 由「整树一份聚合快照」改为按文件缓存与窗口无关的用量观测,正在进行的会话追加时只重解析该文件,跨日与改窗口长度直接命中,热刷新也不再为全部 rollout 读取头尾指纹(冻结日志实测追加 / 次日首轮 0.04 s → 0.01 s,结果逐字节一致)。SQLite 源经实测评估保留现有缓存方式(全量读取约 60 ms/天,改造会拖慢每轮热刷新)。
  • 本机缓存跨日不再失效 (C116):JSONL 源(Claude Code / CodeBuddy / Grok / Pi / Kimi Work / Kimi Code CLI)的缓存条目改为只保存与采集窗口无关的用量观测,身份不再包含「今日」与窗口天数,每天首轮刷新与改动窗口长度都直接命中缓存(冻结日志实测次日首轮 0.18 s → 0.02 s,结果逐字节一致)。Kimi Code CLI 并入共享 JSONL 缓存引擎,删除约 1,800 行旧版专用缓存引擎与流式聚合代码,旧引擎遗留的缓存文件自动清理。
  • Windows 托盘配额环与悬停预览卡读取真实面板字段 (C115):T12 交付的托盘速览与 420px 预览卡按面板中不存在的字段(subscriptions / totalCostText / agents / resetsIn / status)取数,托盘恒显示「额度剩余 100% · 今日 $0.00」、预览卡恒为 100% / 0 活跃。改为读取真实字段(跳过失败服务,与 mac 菜单栏配额环同口径),无配额窗口时只画底轨并在提示中省略,预览卡改读后端 panel.preview(与托盘同一份数据、状态灯同 C100 判定表);托盘指针移动不再逐次读取设置并重复定位窗口。
  • 软件更新旧版本信息残留治理 (C113):
    • Windows 跳过版本追平自动清除:修复用户跳过版本后升级至新版本时,因 offered 为 None 导致 update_skipped_version 在 settings.json 中永久残留的缺陷;software_update.rs 引入 local_version 比较,在应用启动首检与检查更新中判定本地版本追平或超过跳过版本时自动调用 persist_update_fields 清除跳过记录,严格对齐设计 07 §4.2 R4;
    • macOS 启动即时比对清空:SoftwareUpdateService.start() 启动时立即校验 preferences.skippedVersion <= localVersion,满足条件即刻清空 UserDefaults,无需等待 30 秒及联网请求,杜绝离线或关闭自动更新时的偏好滞留;
    • 自替换回滚安全保护:SoftwareUpdateInstaller 新增 removeWorkingArtifacts(keepBackup: true),在原子替换遭遇极端回滚失败时仅清理临时工作包、保护旧版完整备份目录不被误删。
  • 设置中心统一悬浮极客高斯错误胶囊浮岛与 0px 布局防抖 (C111):彻底移除原 ScrollView 顶格裸插入的 settingsErrorMessage 导致的面包屑与标题剧烈下沉(CLS +38px 位移彻底归零);右侧内容视口改用 .overlay(alignment: .top) 悬浮挂载 8pt 卡片级连续圆角、420pt 固定宽、42pt 标准舒适高的高斯毛玻璃胶囊;集成关闭按钮外圈 24×24pt 环形微圆环 4 秒平滑倒计时闭合,支持鼠标悬停 (Hover) 自动暂停并高亮 Accent 蓝,支持中心 ✕ 随时手动清除;增加侧边栏切 Tab 瞬时错误自动清除机制,彻底消灭跨 Tab 泄漏残留。
  • 发版前置核实规则 (C105):docs/devel/design/07-软件更新.md 新增 §4.2 R1.4 —— 打 tag 前必须逐项核实 VERSION 与 tauri.conf.json 的 version 一致、CHANGELOG.md 存在 ## [<VERSION>] - <日期> 版本块、并以 gh secret list 实测 TAURI_SIGNING_PRIVATE_KEY / _PASSWORD 已配置;卡片或文档内声称「已写入 secrets」不作为依据。源于 2026-10-26 v0.13.0 首发事故:T09 卡 check-5 声称密钥已同步写入 GitHub Actions secrets,实际仓库无任何 secret,导致 release-windows 按 fail-closed 退出、Release 停在草稿。
  • macOS artifact 逐日校验复用 ISO 格式器 (C106):ArtifactStore 逐日校验不再每轮新建 DateFormatter(解析开销约为复用格式器的 100 倍),热路径 ISO 解析统一走共享格式器,消除每轮刷新约 2 秒主线程 CPU;新增满尺寸(10 agent × 182 天)校验耗时用例。
  • Claude 单价按 Anthropic 官方校正并按 TTL 计价缓存写入 (C107):Opus 系列单价由高估约 70% 校正为官方口径,cache_creation 按 5 分钟 / 1 小时 TTL 分别计价(1 小时写价高于 5 分钟),设计 01 计费规则同步回写。
  • 价卡单一事实源 pricing-catalog.json (C108):设置页展示单价与采集端计费同源,消除 deepseek-v4.1-flash 展示 $0.15 而按 $0.30 计费的漂移;新增 scripts/gen-pricing-catalog.mjs 由单一事实源生成两端价卡。
  • Windows 出站网络 command 移出主线程 (C109):设备码登录与订阅额度验证的阻塞式网络调用改为异步 command,不再冻结托盘与界面;设计 05 回写「主线程不得发起阻塞式出站网络」规则。

调整与优化 (Changed)

  • 窗口边界唤醒与刷新退避改为跨端共享 (T17):macOS 与 Windows 的额度窗口边界唤醒、刷新退避提为共享 collector-policy::refresh 的一份实现(Windows 进程内、mac 经静态库 C ABI 进程内调用),原两端公式删除;新增 tests/fixtures/refresh-policy-parity 双端对拍用例。行为不变,仅统一两处边界口径:重试计数 0 与 1 同为首个重试档、窗口重置时间接受数值小数。
  • macOS 额度策略改为进程内调用 (T16):macOS 链接共享策略的 Rust 静态库(Universal 2),额度门禁与回填在 App 进程内计算,单次约 0.06 ms(此前经采集端子命令约 5 ms),App 本体增大约 1.3 MB(+6%)。采集端的 Bruce-collector policy 子命令随之退役。直接 swift build 前需先运行 zsh scripts/build-policy-ffi.sh(验证与打包脚本已自动调用)。
  • macOS 额度门禁与回填改用共享实现 (T15):macOS 刷新时的额度查询门禁与回填改为调用与 Windows 相同的 Rust 实现(T15 经采集端子命令,T16 起在 App 进程内),删除 Swift 版本,两端不再各写一份。策略计算失败时本轮不更新也不猜测查询范围,按采集失败重试,界面继续显示上一轮数据;本轮换发的登录令牌照常保存。
  • 订阅额度门禁与回填改为跨端共享的一份实现 (T13):额度查询门禁与回填从 Windows 端提为采集端共享 crate collector-policy,Windows 改为调用它;新增双端回填共享用例后发现并统一了四处分歧——macOS 查询失败时余额型订阅(如 DeepSeek)不再丢失上次的余额金额;Windows 被跳过查询的订阅卡保持原位置,不再被挪到末尾;成功结果已带的新鲜度标记不再被改写;旧版快照中「查询成功但无数据」的记录可作为失败时的回退值。
  • Windows 运行时核心按职责拆分 (C128):runtime_core.rs(1,639 行)拆出窗口激活与快捷键、看板几何、状态灯三个子模块,代码逐字移动、对外路径不变。
  • 采集端本机扫描接口收敛 (C126):不走缓存的扫描函数只作为测试对拍的参照实现编入测试构建,collector-local 对外只保留缓存扫描接口。
  • README 与设计索引对齐现状 (C125):README 版本号更新为 v0.13.0,补充软件更新与用量分析工作台特性、updates/ 数据目录,Harness 数量与设计基线范围按现状更正;设计中心索引的「最后更新」与各设计文档同步;设计文档中的刷新间隔可选值按实现更正为 5 / 15 / 30 / 60 分钟。
  • 采集请求契约清理 (C123):两端不再发送采集端从未读取的 localPricing 能力与 subscriptionQuotaOnly / subscriptionProviders 标记,凭据白名单移除无人写入的 providerEnv(Windows 旧凭据文件中的该字段读取时丢弃,不影响其它凭据);采集端改为显式拒绝这些字段。
  • 采集端额度执行精简 (C122):删除从不生效的账号并发许可与两层账号去重(single-flight)脚手架,额度查询的并发上限与结果不变。
  • 设置中心分段选择器高对比浮岛、开关状态居左对齐与模型用量统一更名 (C112):
    • 分段选择器选中对比度跃升:浅色模式激活项采用纯白微浮岛 (#FFFFFF) 配合 0.8px 柔和边框与立体软投影,文字转为纯深黑 (#0F172A);深色模式激活项采用明亮灰阶浮岛 (#343946) + 高亮描边 + 微阴影,文字为纯白,彻底解决此前配色模式、界面风格、仪表盘布局、刷新间隔分段选择器与轨道底色差过小(1/255)导致无法辨别激活项的问题;
    • 开关状态文字视线流统一居左:「锁屏暂停订阅刷新」与「系统预警通知」开关说明文字统一由开关右侧移至开关左侧,规范为 [已开启/已关闭] [Toggle 开关] 统一视线流排布;
    • 概念统一更名为「模型用量」:双端设置侧栏导航项、面板标题、面包屑、授权配置行等统一更名为「模型用量」,准确表达 Token 深度分析与各模型统计的业务内涵。
  • 本机扫描提速:缓存一次性写盘、解析前字节预筛、次要源并行扫描 (C110):五处缓存写盘由 serde_json::to_writer 直写未缓冲文件改为 to_vec 后单次 write_all(Claude 冷扫内核态 0.61 s → 0.03 s);行读取复用缓冲、JSONL / Codex 以 memchr::memmem 字节预筛跳过非用量行;8 个次要源改为 local_workers 工作池并行、按固定源序合并。冻结日志副本实测冷扫 2.15 s → 0.17 s,artifact(去 generatedAt)逐字节一致。
  • 本地验证脚本 verify-local.sh 提速 (C104):17 项 Swift Harness 由 17 次串行 swift run(每次重解析依赖与重编译)改为 swift build --build-tests 一次性多核并行编译 + 经 --show-bin-path 直接运行二进制;find 剪枝由 './.build' 修正为 '*/.build' / '*/node_modules' 递归排除子模块缓存。全量验证耗时 11m39s → 24.3s(约 28.7×),17 项 Harness 覆盖与输出 100% 等价。

Bruce v0.13.0

Choose a tag to compare

@github-actions github-actions released this 26 Oct 03:27

Bruce 0.13.0 发布说明

新功能 (Added)

  • macOS 应用内软件更新 (T10):

    • 维护页「软件更新」卡(方案 B):设置中心「维护」页顶部新增分组,三行(自动检查更新开关 / 当前版本 / 检查更新 + 上次检查时间)+ 底部状态区,结构与逐字文案对齐高保真 demo apps/win/demo/win-settings-update-flow-demo.html;有可用更新时「维护」导航项尾部出现 6pt 蓝色发光角标;通用页原「版本」行移除,侧栏底部版本号带 v 前缀。
    • 检查与自动检查:仅请求 Releases latest-download 直链 latest.json(不调用 GitHub API,超时 10 秒),semver 纯函数比较;自动检查默认开启、启动 30 秒后首查、此后每 24 小时一次,失败完全静默,仅手动检查失败在状态区与状态行告警;「跳过此版本」持久化,远端出现更新版本时自动恢复提醒;裸 swift run 等无 bundle 版本场景降级为「开发版本」且不发起网络请求。
    • 下载校验与自替换安装:下载到 ~/Library/Application Support/Bruce/updates/(进度可取消),SHA256 对照清单、ditto 解压并 xattr -cr 剥离 quarantine,复核包内 bundle 标识与版本(须等于清单且高于本地)后才进入就绪;「安装并重启」同卷原子替换并把旧版本移入备份,替换失败自动回滚;重启采用先退后起的等待器,避免新旧实例同时占用菜单栏与全局快捷键;从 DMG / 随机只读挂载等不可写位置运行时降级为引导手动下载。
    • 双端文案对拍 fixture:8 态状态区与各失败分支的逐字文案落 tests/fixtures/update-copy-parity/cases.json,新增 SoftwareUpdateHarness(44 项)纳入 verify-local.sh,Windows 实现 (T11) 同读该文件。
  • 经典风格升级高斯模糊(方案A 柔光云母高斯)与全风格 1:1 紧凑圆角体系 (C102):

    • 紧凑圆角体系 1:1 统一 (macOS & Windows):主面板外框圆角全风格(Classic / Liquid Glass / Nothing)统一收敛至 10pt(旧 Classic 22pt),顶部 1px 发线内缩对齐至 8pt;主卡片容器(PanelCardContainer / .card)统一收敛至 4pt(旧 Classic 16pt),顶部 1px 折光边内缩对齐至 4pt;卡片内细分子槽、分段统计格、操作按钮、状态指示芯片、品牌徽章与多账号子卡统一收敛至 3pt(旧 Classic 8~10pt);顶栏 Tab 切换器外框为 3pt,滑动胶囊为 2pt,彻底消除原 Classic 风格大圆角对卡片内部内容排版的挤压感,与 Nothing 极客精密桌面美学彻底对齐。
    • 方案 A 柔光云母高斯光学质感:深色模式采用高透高斯底板(macOS .hudWindow,Windows rgba(18, 20, 26, 0.48) + backdrop-filter: blur(36px) saturate(185%)),搭配面板顶部 1px 发线;卡片采用 0.085 纯白浮岛、0.18 描边与顶部 1px 晶体折光边;浅色模式重构为系统 .popover + 暖瓷云母底板(rgba(243, 245, 250, 0.72))托底,纯白浮岛卡片(rgba(255, 255, 255, 0.62))显著拔高视觉层级,搭配外冷灰暗界(0.085)与内纯白折射边(0.88)双层复合轮廓,图表与状态色适配高对比度森林绿(#0E6245)与深海蓝(#184E77),消灭浅色发灰发脏与无层次感问题。
    • 风格隔离与跨端一致性:设置中心窗口保持 Fluent 平面风格(遵循既有 C067 契约,不引入毛玻璃与圆角覆盖);Windows 端同步镜像 CSS 样式与几何参数,双端测试全绿通过。
  • 双端仪表盘顶栏三图标 Tab 切换、角标融合与水平滑动动效 (C088):

    • 顶栏三图标导航与角标融合:在仪表盘顶部 HUD Header 右侧以三图标导航(Token 用量 chart.bar.xaxis / 订阅配额 creditcard / Agent 活跃 waveform.path.ecg)替代原 N AGENTS ACTIVE / STANDBY 文本;Agent 运行状态作为绿色呼吸小点无缝融合于第 3 个图标右上角(悬停展示实时活跃数量与状态提示)。
    • 单卡轻量呈现与方案 1 方向感知水平滑动动效:Tab 模式下仪表盘只展示当前激活卡片,卡片切换遵循方向感知水平滑动(左→右从右侧推入,右→左从左侧推入)配合药丸滑动指示条与卡片高度弹性过渡,保留键盘 1/2/3 快捷切卡;既有三张卡片内部视觉、指标与布局 100% 原样保留。
    • 卡片停留状态记忆与通用设置开关:最后停留的 Tab 分页自动持久化并在下次唤醒面板时无缝恢复;通用设置中新增「看板卡片布局」分段选择器(纵向级联 vs 顶栏 Tab),macOS 与 Windows 11 双端 1:1 对齐交付。
  • 面板底栏新增外观切换按钮 (C098):仪表盘底栏「刷新」按钮右侧新增一个仅图标按钮,单击在「跟随系统 → 浅色 → 深色 → 跟随系统」间循环,图标即当前态(circle.lefthalf.filled / sun.max / moon),无需打开设置窗口即可在面板内即时切换配色。与设置中心「通用 → 配色模式」共用同一持久化偏好 OnboardingConfiguration.appearanceMode 与「先存后生效」语义(保存失败不变更运行态外观),循环顺序由 AppearancePreference.next 单一纯函数给出,避免两处顺序漂移。该能力为 mac 独有(Windows 恒深色、无配色模式偏好,底栏有意不镜像,已在 apps/win/src/index.html 注释登记分歧)。

  • 双端仪表盘顶部状态牌改为四色状态灯 (C100):

    • 形态收敛与品牌字统一:删除 HUD 顶部左侧的 SYS.OK 文字牌(mac MenuBarViews.swift 与 Windows index.html #runtime-status),顶部左侧收敛为「状态灯 + 品牌字」;品牌字在所有主题(Classic / Liquid Glass / Nothing)统一为 Bruce(移除 // HUD 后缀与 Nothing .hud-brand 的 uppercase 转换)。
    • 四色语义与双端同口径聚合:新增纯函数判定源 DashboardStatusToneResolver.resolve(mac BruceAppCore 与 Windows app.js resolveDashboardStatus 共享 tests/fixtures/status-tone-parity/cases.json 对拍),聚合「采集健康度」与「订阅服务健康度(sections[].status)」按 error > warn > ok > neutral 取并:绿(正常)、黄(partial / stale / authRequired)、红(failed / error / unavailable)、中性灰(notConfigured / empty 首次无数据),刷新中呈呼吸脉冲(遵循 C044 面板可见性门控)。
    • Windows 托盘角标同源:托盘图标角标色与提示文案改由与 HUD 状态灯同一判定表计算(Rust 端第三份实现,同读共享 fixture 对拍),不再出现托盘显绿「数据已更新」而看板亮红灯的分歧;提示为「Bruce · 原因」。
    • 触碰按需展开原因:状态灯绑定悬停提示与无障碍标签(mac .help + .accessibilityLabel,Windows title + aria-label + role="status"),健康态显示「运行正常」、刷新中显示「正在刷新…」、异常态按「态名 · 具体原因」展开:采集侧决定灯色时取采集详情(Windows runtime.error 机器码先转为中文释义,未登记的码不外露),订阅侧更严重时点名对应服务(如「失败 · Codex」)。
  • Windows API Key 类五家专属配置对话框逐字对齐 mac (C083):Kimi / DeepSeek / Z.ai / Cline 统一为 API Key 单字段、火山引擎为 Access Key + Secret Key 双字段,字段标签、引导文案、控制台外链与脚注逐字对齐 mac 对应对话框(如 Kimi「在 kimi.com/code 申请 Kimi For Coding API key」、Cline「在 Cline 控制台 Settings > API Keys 创建 API Key」,Cline 另带 ClinePass 三窗口脚注)。火山引擎新增「从 CC Switch 导入」:以 SQLITE_OPEN_READ_ONLY 只读打开 CC Switch 本地库执行 SELECT meta FROM providers WHERE name='火山Codingplan' LIMIT 1,取 usage_script.accessKeyId / secretAccessKey(回落顶层同名键)并对 SK 逐层 base64 解码,导入前先拉起只读确认;库不存在时按钮隐藏、行缺失时给出可诊断错误,全程不回写外部库。Z.ai 由自由输入站点改为 国内站 (open.bigmodel.cn) / 国外站 (api.z.ai) 单选并据此派生 base_url。保存成功后立即执行该 Provider 的结构校验(DeepSeek 额外一次真实余额试查,关闭重定向以避免 Bearer 随重定向外泄),并新增「重新验证」按钮。

  • Windows 订阅额度页文案与交互细节对齐 mac (C096):底部提示位置移到两张卡下方且措辞逐字对齐(含「统一」);空态补「尚未配置任何订阅 Provider」+ 副标题「从下方添加服务」;对话框在验证通过时追加「 · 验证通过」后缀(对齐 mac APIKeyProviderConfigDialog);「添加服务」改为「选择 → 点『添加…』」两步交互(对齐 mac ProviderPopUpPicker,选中仅暂存、点确认才落库);必填字段未填齐时「保存并验证」置灰、填齐即启用;账号移除前弹出「移除 <名称> 账号?」二次确认。

  • Windows Codex 设备码登录与本机账号只读发现 (C084):

    • 设备码三步登录:设置页新增「登录新账号」,按 mac CodexDeviceFlow 同一契约走 POST /api/accounts/deviceauth/usercode(JSON {client_id})→ 在 https://auth.openai.com/codex/device 输入验证码 → 轮询 POST …/deviceauth/token(403/404 待授权、其余非 200 fail-closed,超 expires_in 报过期,服务端未给 code_verifier 时本地 PKCE 回落)→ POST /oauth/token 换 id/access/refresh 三令牌齐备才成功;只解析不验签 id_token 取 chatgpt_account_id(namespaced → 顶层 → organizations 首项)与 email,缺账号标识 fail-closed 不写半成品。验证页由 ShellExecuteW 打开(不新增 opener 插件),打不开时前端仍展示验证码与地址供手动访问。
    • 本机账号只读发现:发现本机 CLI 账号 只读 %USERPROFILE%\.codex\auth.json(取 tokens.account_id + email),发现 CC Switch 账号 只读 %USERPROFILE%\.cc-switch\codex_oauth_auth.json(取 accounts.*.email);两者一律只写元数据(authorization_state = reauthRequired,不导入任何令牌),已有记录不覆盖、外部文件绝不回写。
    • fail-closed「已配置」判据:codexQuotaAccounts 的 access_token 必填放宽为「元数据记录可缺令牌」,并新增逐账号「完整可用凭据记录」判定经 IPC 下发(usable);UI 的「已配置」、启用开关禁用态与对话框横幅据此排除元数据记录 —— 发现账号在行上呈现为「需要重新授权」,但不会让看板去查询必然失败的额度。
  • Windows Claude / Grok / OpenCode GO 对话框对齐 mac (C085):

    • Claude 高级入口收拢:零配置只读跟随仍是主路径,手工粘贴令牌与凭证 JSON 收进「高级」折叠区(默认折叠),状态行、重新检测与移除服务保持不变。
    • Grok 本机只读跟随:新增 %USERPROFILE%\.grok\auth.json 只读跟随(取带非空 key 的 https://auth.x.ai::* / */sign-in 作用域条目,按 expires_at 判过期),提供「重新检测」与「从本机导入」;本机跟随计入「已配置」(与 Claude 同范式),采集与定向刷新前同样自动注入 grok-cli 账号,全程只读不回写。
    • OpenCode GO 引导与身份:粘贴引导逐字对齐 mac(打开 opencode.ai → 登录 → 开发者工具 → Application → Cookies → 复制 auth 值 (Fe26.2**...) 与 workspace URL 中的 wrk_ ID),账号身份改由 workspaceId 派生 —— 同一工作区重新粘贴即 upsert 到同一账号;缺键文案改为「OpenCode GO 凭证不完整, 请重新粘贴」。
    • 三家验证语义:Claude 访问令牌过期但刷新令牌仍有效时按「待刷新」照常放行、刷新令牌亦失效才判需重新登录;Grok 按作用域条目 expires_at 判定;OpenCode GO 按 auth + workspaceId 双非空判定。
  • Windows 订阅额度页骨架 1:1 对齐 mac (C082):页面收敛为「订阅服务(已添加行 + 配置按钮 + 拖拽重排)+ 添加服务(只列尚未添加项)」;新增按 Provider 的专属配置对话框基座与 Provider 验证状态存储(enabled / lastVerifiedAt / verificationStatus / failureReason),「保存并验证」写入成功后立即跑结构校验并按结果落状态,ok 触发该 Provider 定向刷新。

  • Windows StepFun 配置对话框与网页登录自动捕获 (C086):

    • StepFun 对话框:Oasis-Token 字段 + 引导文案(可点击上方一键登录自动绑定(支持国内/国际站),或控制台按 F12 复制 Cookie)+ 控制台外链 + 脚注 + 网页登录自动绑定区(🇨🇳 登录国内站 / 🌐 登录国际站)。
    • 内置网页登录窗口:独立 WebviewWindow + WebviewUrl::External 加载站点订阅页;导航栏(标题 + 站点切换 + 取消)+ 工具栏(后退/前进/刷新/订阅页/平台首页/当前 URL)+ 底部(清除登录缓存 / 我已登录,立即绑定);UA 用桌面 Chrome 串 —— 用户在内置窗口登录即可,无需外部浏览器与 devtools。
    • cookie 捕获与远程校验:cookie 变更 + 2s 轮询双轨;仅在当前页面 URL 属目标站点域名时自动捕获,取 Oasis-Token 且长度 >10 且 cookie 域含目标关键字;捕获后 POST QueryStepPlanRateLimit(带 Oasis-Token / Oasis-appID 10300|20700 / Oasis-Platform / Oasis-Language / Oasis-Webid),200 才回填绑定并持久化;「清除登录缓存」删除该域全部 cookie 后重载。
    • 实现约束与平台退路:cookie 读取必须经 async command 或独立线程(Windows 同步 command 会死锁);若真机无法稳定读取,退化为「外部浏览器登录 + 手动粘贴 Oasis-Token」并按设计规则 24 登记为平台差异。
  • Windows 看板订阅段按 Provider 验证状态过滤 (C087):看板订阅段只保留 verificationStatus == ok 的 Provider 的 service(对齐 mac),未验证 / 验证失败 / 需重新登录一律过滤;本地用量(agents)与总成本不受影响;过滤点落在视图模型 / 面板组装层,不在前端做猜测。

移除 (Removed)

  • Windows 删除三张 mac 没有的遗留凭证卡片 (C095):在 C084–C086 三个专属录入通道就位后,移除「添加或更新账号凭证」「导入账号」「高级:完整凭证字段维护」三张卡与整页「检查已保存账号连接」—— 凭据只能经专属对话框(保存即验证)写入,不再保留绕过验证与「已添加」步骤的旁路入口。

修复 (Fixed)

  • 浅色经典风格视觉重构(方案A 苹果纯净白)与全主题 8pt 呼吸感圆角体系升级,修复视口腰斩、坐标下沉与布局塌陷 Bug (C103):
    • 经典浅色配色重塑(方案 A Apple Studio Pro Light):经典浅色卡片告别 0.45 塑料白与透黑水泥灰,消费纯白浮岛磨砂玻璃(rgba(255, 255, 255, 0.96))搭配冷灰精密微边框;底板通过 AppKit 原生 NSVisualEffectView 挂载 tintView 实现纯正 rgba(246, 248, 252, 0.92) 柔白云母雾面;Token 与金额数据色彩升级为高对比度森林墨绿(#047857)与冷光蓝调(#0284C7),背景噪点弱化 65%,消除视觉脏感。
    • 现代呼吸感圆角体系平滑化 (8pt,全主题覆盖):主面板外框统一升级至 14pt(macOS & Windows);主卡片容器(PanelCardContainer 与 .card)统一升级至 8pt(覆盖 Classic、Liquid Glass 以及 Nothing 主题);内部细分子槽、双槽位卡、账号卡、操作按钮等按黄金比例平滑对齐至 6pt;进度条与指示量条收敛为 4pt,彻底消除原 4pt 直角给桌面带来的局促压迫感。
    • 视口与布局防越界修复:修复当内容高度溢出时视口生硬硬截断导致双槽位卡被腰斩的问题,在卡片滚动区底部注入平滑渐隐 Mask;修复 resizePanel 丢失下边界吸附致窗口下沉穿透屏幕的坐标计算缺陷,补齐 max(unclampedY, minimumY) 安全 Clamp;对多模型行引入弹性截断压缩,防止极端长模型名称顶破换行。
  • Windows 订阅凭据载荷形状与「已配置」判据修正 (C081):Claude / Grok / OpenCode GO 三家手工录入的载荷改为采集端可解析的原生形状(claudeAiOauth 包装 / 作用域条目 / {auth, workspaceId}),形状不合法时在写入前即拒绝;「已配置」改为 fail-closed —— 只有完整可用的凭据记录才算数,形状不合法或被读取侧丢弃的账号不再计入;出站注入仍只下发采集端需要的字段并剔除 reauthRequired 账号。
  • Windows「移除服务」只删已添加条目不删凭据 (C089):移除改为后端 remove_provider_credentials 在凭据存储锁内一次原子写删除该 Provider 全部凭据(含读取侧已丢弃、界面不可见的不合规账号,以及 Claude / Grok 遗留的整体 OAuth 字段),再移出已添加集合并派生收敛启用态;删除失败即中止、不改已添加集合(fail-closed),杜绝半删状态;删除前二次确认,失败以就地错误给出可诊断原因;重加服务不再复活旧账号。
  • Windows 订阅行状态尾件不读验证结果与本机登录态 (C091):行尾件判据改为「配置判据 × verificationStatus」两维,输出未配置 / 已配置 / 验证失败 / 需重新登录四态;本机只读跟随的 Claude 登录态计入「已配置」(对齐 mac claudeAppOrLocalProbe),该判据由行尾件、启用开关禁用态、对话框横幅与「重新验证」入口、授权摘要共用;未发现或已过期的本机登录态仍算未配置。
  • Windows 接受 mac 拒绝的密钥格式 (C092):validate_credential_payload 按 Provider 补齐格式校验——含空白字符一律拒绝;火山 AccessKey / SecretKey 长度 ≥8;Cline ≥16;Z.ai 必须 id.secret 形式且站点主机为 open.bigmodel.cn / api.z.ai;Kimi 非空无空白。写入与验证共用同一套判据,拒绝时指出具体不合规字段。
  • Windows StepFun 站点由对话框默认值决定而非令牌 (C093):站点不再预选默认值,仅当用户显式选择时才写入 site,未选择则只存 token、由采集端按令牌推导;采集端 is_stepfun_global 明确「用户显式选择 > 令牌推导」优先序,保存值等于自动推导结果时视同未指定,避免国际站令牌被默认值查错站点。
  • Windows「授权与隐私」摘要列出全部启用 Provider (C094):摘要改取「已启用 ∧ 已配置」交集(与行尾件共用同一判据,含规则 21 fail-closed 与本机跟随),未配置或未...
Read more

Bruce v0.12.2

Choose a tag to compare

@github-actions github-actions released this 22 Oct 07:02

Bruce 0.12.2 发布说明

新功能 (Added)

  • Windows 端 Claude 凭据零配置跟随本机 CLI 登录态 (C075):对齐 mac 的 cc-switch 式跟随范式,Windows 不再强制手工粘贴 —— 启用 Claude 订阅后自动只读跟随本机 %USERPROFILE%\.claude\.credentials.json(缺失时回退 %USERPROFILE%\.claude.json),规范化后注入 claudeQuotaAccounts 的 claude-cli 账号(用户已存自有账号时手工配置优先);设置中心「订阅额度」新增「Claude 本机登录态」卡,显示已跟随 / 未发现 / 已过期,并提供「立即检测」与「读取本机登录态」(显式持久化为账号凭证)。仅只读、不回写外部文件,文件缺失或格式非法时静默回落,粘贴入口保留作多账号兜底。
  • Windows 端 Nothing 点阵主题 1:1 深度对齐 (C066):
    • 内置官方授权 Doto / Space 矢量字体族:引入开源 SIL OFL 授权的 Doto[ROND,wght].ttf、SpaceGrotesk[wght].ttf 与 SpaceMono 系列字体,通过 @font-face 注册。彻底告别通用字体与 CSS 粗糙径向渐变伪点阵,还原与 macOS 1:1 等价的纯正 N-Dot 工业点阵质感。
    • OLED 纯黑纯平面几何基座:Nothing 模式下锁定为 10px 紧凑圆角、#000000 纯黑底色与 1px #222222 细边框,彻底关闭毛玻璃模糊与阴影;内部卡片与槽位统一为 3px 硬朗方角。
    • 逐像素对齐视觉组件:
      • Hero 数字与呼吸微光晕:Doto 52pt 翠绿 (#4A9E5C) 主数值,带呼吸微光晕;小数点提纯为 4×4px 实心小方块,与整数和小数部分平滑对齐;
      • LIVE 方块指示灯:重塑为 5×5px 纯色实心方块,移除 Fluent 光晕呼吸环;
      • 订阅卡三档阈值图例:底部新增 <50(绿)/ 50–79(黄)/ ≥80(红)方块阈值图例;
      • Agent 展开区点阵控制台:多模型占比采用 P4 方案(Top 1 翡翠绿,次要模型 45° 斜点阵条);项目分布深度对齐 PRJ.CONSOLE 终端控制台([P1] 标签、点阵导引虚线、数值、百分比 Badge 与 6-Tick 微型液晶进度格);
      • T07 工作台 Nothing 风格化:全景工作台(KPI 磁贴、时序分析图、归一化大盘、Agent 透视矩阵)在 Nothing 下自动切换为纯黑表面、单色翠绿折线与 Space Mono 字体。
  • Windows 端视觉重塑与 T07 Agent 用量全景工作台深度对齐 (T08):
    • 窗口底座透明化与悬浮质感:tauri.conf.json 配置 transparent: true,#panel 注入 16px 平滑连续圆角、0 24px 64px 弥散环境阴影与 1px 微发光边框,配合毛玻璃滤镜彻底消除黑灰直角方块感。
    • Catmull-Rom 三阶平滑曲线走势图:app.js 引入 catmullRomToBezier 平滑样条插值算法与渐变面积填充,终结生硬锯齿折线,对齐 macOS Swift Charts 工业级视觉质感;进度条全面升级为微圆角胶囊条与状态光晕。
    • 设置中心 T07 Agent 用量数据分析工作台深度移植:完整移植 4 格核心 KPI 磁贴(总 Token / 折算费用 / Cache 命中率 / 活跃 Agent)、5 档时间跨度选择器(今日/近7天/近30天/本月/全部历史)、多维度时序折线分析、全域模型智能归一化大盘(剥离渠道前缀与版本修剪,保留底层渠道树下钻)、多 Agent 协同透视矩阵与 Token 构成四象限,保留底层会话探针与授权。
    • Fluent 2 现代药丸滑动开关:全面替换原生粗糙的 HTML input[type=checkbox],重构为具备流畅滑动微动效的 Fluent 2 Toggle Switch 胶囊开关,完美兼容现有自动化测试接口与 Nothing 主题。
  • 设置中心 Agent 用量深度分析与多模型跨源归并工作台 (T07):
    • 多源异构模型智能归一化 (ModelNormalizer):剥离渠道前缀(cline-pass/、zhipu/、openrouter/ 等)与版本变体修剪(-20250219、[thinking] 等),将跨 Agent、跨渠道的碎片化模型名称自动聚合成官方主模型规范大盘(如将多渠道 glm-5.3 或 cline-pass/deepseek-v4.1-flash 收敛合并),保留来源渠道贡献树(Sources Contribution)下钻能力,自动继承内置 43+ 款主流基准单价与用户自定义单价覆盖。
    • Swift Charts 原生时序折线分析 (TimelineChartCard):支持 Catmull-Rom 平滑曲线与堆叠面积图;支持按 Agent、按主模型、按 Token 构成、按费用 4 维切换;提供 MA7 均线与 Crosshair 悬停探针。
    • 全景数据分析组件矩阵:实现 CanonicalModelAnalyticsCard(模型份额与渠道下钻)、AgentComparisonMatrixCard(多 Agent 贡献矩阵与 Top 3 代码仓分布)与 TokenCompositionCard(输入/输出/缓存四象限与 Prompt Caching 节省金额分析)。
  • 电脑锁屏后禁止订阅刷新 (C064):在设置中心新增「锁屏暂停订阅刷新」开关(持久化至 OnboardingConfiguration.pauseSubscriptionRefreshOnScreenLock,默认开启)。当开关开启且系统处于锁屏状态时,定时刷新自动降级为纯本地扫描(localUsageOnly,includeExternalQuotas=false),杜绝人离开电脑时的无意义云端订阅配额消耗与 429 限流风险;当屏幕解锁后,若订阅额度已陈旧或已到期,立即补偿触发一次全量刷新,实现无缝衔接。

调整与优化 (Changed)

  • Windows 看板顶部彻底零输出 (C080):继 C079 撤除状态行与诊断行的内容之后,本次连承载元素 #dashboard-status 一并移除 —— 看板顶部除 HUD 状态牌(SYS.OK / 刷新中 / 部分失败 / 数据过期)外不再存在任何能显示文字的节点,与 macOS 结构一致。
    • 定向刷新被后端拒绝时改为静默:与 mac RefreshScheduler.refreshSubscription 一致(mac 在拒绝条件下直接 return,无任何用户提示,靠按钮禁用态预防),可见反馈仅为按钮恢复可点;原先的状态行文案与 SCOPED_REFRESH_ERRORS 映射表一并删除。
    • 面板无法渲染 / IPC 失败等致命错误只把状态牌标为「失败」,详情输出到浏览器控制台,不再往顶部写任何文案。
    • 影响:若你依赖「定向刷新被拒时看板顶部出现中文提示」,该提示已按 mac 口径移除;如需保留,应改为在订阅卡内部呈现(与 mac 的 provider note 同位置)。
  • Windows 看板顶部撤除运行态状态行与诊断行,完全对齐 macOS (C079):看板顶部此前会打印运行态详情(错误文案、上次成功时间、空数据提示)与服务级诊断行。现顶部除 HUD 头(状态牌 + Agent 计数)外不再有任何文字行,与 macOS 一致。信息不丢:服务级失败(含「需要重新授权」)改在订阅卡内部呈现(与 mac 同位置),整体采集错误在设置窗口,Agent 探针在设置中心。HUD 状态牌(SYS.OK / 刷新中 / 部分失败 / 数据过期)按原设计保留。
    说明:同一元素 #dashboard-status 仍保留给两个事件驱动场景 —— 定向刷新被后端拒绝时的可读提示,以及面板无法渲染时的致命错误提示;常规态该行不存在(:empty 隐藏),故不影响「顶部只有 HUD 头」的观感。

修复 (Fixed)

  • Windows 看板顶部不再直出诊断码,诊断行只留需用户动作的故障 (C078):看板状态行此前把内部诊断码原样打印给用户 —— 其中 SNAPSHOT_RESTORED 是每次正常启动都会写入的码,而「上次成功」时间是持久化的,导致冷启动到首次刷新之间面板顶部恒定挂着 SNAPSHOT_RESTORED · 上次成功 2026-…Z;同一行还直出 ISO 原文。现诊断码一律映射为中文文案(如 COLLECTION_PARTIAL → 「部分订阅查询失败」),正常重启类码不再进入用户可见文案,「上次成功」改为本地可读时间。同时诊断行的过滤条件从「任何 error 级服务问题」收紧为「需用户动作的严重故障」(认证 / 权限 / 凭证缺失类)—— 一次「临时不可用」或限流不再与「需要重新授权」同等占据看板顶部,这些一次性失败仍保留在订阅卡内部与设置页。HUD 状态牌(SYS.OK / 刷新中 / 部分失败 / 数据过期)按原设计保留。
  • Windows 订阅额度改为按 provider 独立门控并补齐 429 冷却 (C077):此前每轮刷新都把全部已启用 provider 的凭据连同额度查询一并下发,一个 provider 被限流会把整轮刷新拖入 300s 固定退避。现按 quotaAttemptedAt(回退 capturedAt)新鲜度与 rateLimitedAt 30 分钟冷却逐 provider 独立门控:仍新鲜的 provider 跳过查询、命中 429 的 provider 单独进入冷却(其余照常查询),被跳过的 provider 用上一份结果回填并标过期,不丢卡片也不误报新鲜;窗口重置后即使未满间隔也强制重查;手动刷新绕过新鲜度与冷却。Codex 不受门禁影响(其四源合并需要完整首轮结果)。
  • Windows 刷新调度接入网络可达性闸门 (C076):此前断网时仍按指数/限流退避反复重试,既空耗 CPU 又会在恢复瞬间叠加一串补偿请求。现自动刷新前置连通性探测(Windows InternetGetConnectedState):离线时跳过本轮、不累加重试次数、不进入退避,只按 30s 周期重探并把运行态标为「网络不可用」;网络恢复后只补偿一次刷新,不补发离线期间积压的多轮;手动刷新语义不变(离线仍执行一次、不重试)。
  • 价卡表补 deepseek-flash 条目,消除工作台未定价模型 (C073):zcode 等直连官方 API 的历史 deepseek-flash 命名(无任何既有价卡键为其前缀)此前落入「未定价 tokens」;现按官方 V4 Flash 同档(输入 $0.15 / 输出 $0.60 / 缓存读 $0.003 每 1M)独立建卡,不跨档并入 ClinePass 的 v4.1 档,双端共用。
  • 修复升级后 Agent 用量工作台近 7/30 天模型明细只剩当天 (C072):C070 为增量缓存新增逐日/逐小时模型明细桶时,SQLite 缓存条目未纳入聚合格式版本身份,升级后旧格式条目(无日/时明细)被当作合法基数增量追加,历史逐日模型明细永久缺失——月度视图 44.9 亿而「近七天」只显示当天(约 8.7M)。现缓存身份强制比对聚合格式版本,旧条目自动回退全量重建,升级后首次采集即恢复全部明细(一次性全量重扫)。mac 与 Windows 共用同一采集内核,同步生效。
  • 修复锁屏后订阅用量卡片消失 (C071):锁屏期间自动刷新被 C064 抑制为纯本地扫描时,发布的 artifact 携带零 services,仪表盘订阅卡整体消失且因发布时间戳刷新无法自动补偿,只能手动刷新恢复。现「本轮被抑制跳过查询」等价于「全部 Provider 进入跳过集合」,抑制运行原样回填上一份订阅服务并按新鲜期标注(锁屏超 30 分钟显示为过期值而非消失);锁屏期间仍不发起任何外部额度请求。
  • Agent 用量工作台改为真实数据,mac 与 Windows 同口径 (C070):工作台(设置 → Agent 用量)此前多数数值为估算 —— mac 今日逐小时按固定 42/18/40 拆分、费用按 $2.8/1M 平价折算、「轮交互」= Agent 数 × 12、缓存节省按 90% 兜底、7/30 天模型构成按当月比例缩放、构成四象限的输出与缓存写入按总量比例推算、模型归并的子串别名把不同型号(不同单价)混算;Windows 费用 ×¥15.2/1M、模型 ×¥16.5/1M、缓存命中写死 21.0%,「近 30 天」实际只有看板的 14 天。
    • 采集端:artifact 新增逐日(近 31 天)/ 逐月 / 今日逐小时 × 模型的 token 桶,每桶按单价表(含用户价格覆盖)计价并给出缓存节省;daily 补齐缓存读取 / 写入拆分。价格前缀匹配改为确定性的最长前缀(原遍历 HashMap 取首个命中,跨进程结果可能不同)。增量缓存格式升级,升级后首次采集会全量重扫一次本机会话。
    • 工作台:KPI、模型分布、时序(今日逐小时 / 7·30 天与本月逐日 / 全部历史逐月)、Agent 表现与 Token 构成全部取自上述真实桶,不做任何估算;未定价模型单列「未定价」token 量而不计入费用,旧版 artifact 缺明细时显示「—」。「轮交互」(无数据来源)改为「最活跃 Agent · 占比」;项目分布只在「今日」显示(采集端只有今日数据)。模型归并只合并同一型号的不同写法(渠道前缀、快照日期、-latest、[标记]),不再跨型号别名。
    • Windows:工作台按 mac 卡片逐项重做(分段时间范围、导出 CSV 账单 / JSON 明细、折线 / 面积与四维度时序、合并 / 原始渠道模型视图、Agent 构成比例条与下钻、今日 24 小时密度),数据由 Rust 计算并以 mac 产出的 golden 逐字段(含浮点位)对拍锁定。
  • Windows 订阅卡 Provider 定向刷新 (C068):订阅段每个 Provider 头部行尾补齐 mac 同款刷新按钮,只重新查询该 Provider 的额度、不重扫本机会话;结果合并回快照(其他 Provider、本机用量与成本保持不变,失败保留上次成功窗口并标记过期),与全量刷新串行执行。刷新中显示进度环,全量刷新中 / 未授权 / 未启用时禁用。
    • 修复 Windows 从不查询 Cline 额度:采集请求的 provider→凭证字段表漏了 Cline,设置页可保存 Cline 凭证却从未注入采集请求;改为单一映射表并加测试锁定其覆盖全部 Provider。
    • 订阅 section 的 provider 键改由 Rust 运行时层单点归一后下发,前端不再镜像前缀规则(顺带修复 OpenCode GO 徽章取色失败)。
  • Windows 设置窗口即时生效 (C069):对齐 mac,移除底部「保存设置」,每个控件变更立即保存;保存串行合并、失败回滚并提示原因(如热键冲突);只有影响采集的设置(授权、本机会话、启用的订阅、价格覆盖、刷新间隔)才触发重新采集,切换主题或调整顺序不再引发全量扫描。修复授权页「Agent 用量」开关切换无效。
  • Windows 看板与设置窗口按 mac 源码逐项对齐 (C067):以 mac SwiftUI 卡片离屏渲染与 Windows 真实内核渲染在同一份 artifact 上并排比对,定位并修复 Windows 观感与 macOS 差异巨大的根因。
    • 渲染缺陷:.card-title / 模型档位按钮 / 品牌徽章的 font: … inherit 简写为无效声明被整条丢弃(标题失去 12.5pt 半粗、档位按钮回落 13.33px),改为逐项声明并加测试锁;Fluent 14 日柱容器恒为 0 高导致柱体不可见、只剩悬空数字,改为按当日总量占比取高、段按日内份额堆叠、总量紧贴柱顶;热力图程度图例色块无配色规则 (全透明),补齐两主题色阶。
    • 结构对齐:卡片标题行按 mac CollapsibleCardHeader 重排(拖拽手柄 → 定宽标题 → 行尾状态件 LIVE / 最后更新 → chevron),收起态迷你摘要嵌入标题行;四格细分按内容定宽;模型用量改由标题旁 chevron 切换前 3 / 全部(移除自创「展开全部 N 项」行);顶部 Header 改为「状态灯 · 品牌 · SYS.OK | Agent 数」布局,异常态仍在同一小牌内显式提示;底栏改为 SF Symbols 等价线性图标并在刷新中旋转。
    • 数值对齐:热力图列等宽撑满整卡(移除 Windows 自加的列宽上限);classic 卡片描边白 24%、无顶部高光、面板圆角 22;量条高 5 / 圆角 3 / mac 三档渐变 (去外发光);走势线改回 mac LineMark 默认线性折线 (更正 T08 的 Catmull-Rom 平滑,mac 仪表盘并未使用平滑插值);系统字体行高 1.2,Nothing 字体行高取自身度量;mac overlay 描边不增加尺寸,带边框组件 padding 扣除边框宽度。
    • Nothing 主题:当月/选中月份与档位按钮改用 hero accent 绿(原被染成告警红);热力图改为 accent 透明度五阶并错相位呼吸;Hero 改为 Doto 52pt 字体自身点阵 + 纯色呼吸光晕(移除叠加的 radial 遮罩);字体只在 mac 指定的元素上替换;品牌徽章改为品牌色 16% 底 + 品牌色图形;阈值红统一 #D71921;走势线 heroGreen #30D158;点阵日柱段序对齐 mac(首段在顶);Header 状态灯保持圆点。
    • Token 计数 B 档:Rust token_count 补齐 ≥1B 的 x.xxB 档并按 mac 规则裁剪末尾 0(原显示 6235.9M,mac 为 6.24B)。
    • 设置窗口:mac 设置窗口恒用 Fluent 平面 token,不随界面风格切换 —— 撤销 C066 的设置窗口 / T07 工作台 Nothing 纯黑化;侧栏 216 宽并以版本号收尾,内容区间距、分组标题(卡片外)、行标题字重、按钮与主色对齐 SettingsDemoTokens;界面风格与刷新间隔改为 mac 分段选择器,热键独立为「全局快捷键」分组。
  • 回调 30 分钟额度硬编码门禁 (C065):解决设置中心配置的 5 分钟或 10 分钟刷新间隔未能正常刷新订阅额度的问题。
    • 额度周期与用户设置联动:RefreshScheduler 的 quotaRefreshInterval 与用户在设置中心配置的 refreshInterval 实时双向联动绑定,当用户选择 5 分钟或 10 分钟时,订阅额度随定时器按 5/10 分钟周期真实查询刷新,不再被一刀切降级为 localOnly。
    • 锁屏状态探测加固:SystemScreenLockMonitor.isScreenLocked 引入动态双重判定(通知缓存 locked 与 CGSessionCopyCurrentDictionary 底层标志位或运算),确保锁屏状态 100% 精确感知,锁屏期间可靠抑制外部额度查询,解锁后无缝补偿全量刷新。
    • 设置界面文案修正:移除说明中“订阅云端额度自动查询最长 30 分钟一次”的限制性表述,对齐真实联动行为。
  • 对齐 Claude Code (cc) 刷新机制 (C063):解决 Claude 凭证在 8 小时 token 过期后必然报错 PROVIDER_AUTH_REJECTED 导致订阅额度刷新失效的问题。
    • Collector 主动续期与 401 容错:在 expires_at_epoch_ms 剩余时间 $\le 60\text{s}$ 或遇到 401 时,主动调用官方 OAuth 刷新端点 POST https://api.anthropic.com/v1/oauth/token(对齐 cc 2.1.302 的 client_id 与请求头);换取成功后向返回载荷附加 credential_update 指令。
    • 凭据白名单与嵌套持久化:collector-credential 增加 claude 的 access_token / refresh_token / expiry 校验;Swift 侧 CredentialRotationMerge 支持更新 claudeAiOauth 与 claude.ai_oauth 内部嵌套字段,CredentialUpdateCoordinator 对 claude-cli 自动写回 ProviderAccountStore 隔离存储,实现无感自动续期与持久化。
    • 外部 CLI 读取静默防护与弹窗根除:探测 Claude CLI 登录态时改用 /usr/bin/security find-generic-password -s "Claude Code-credentials" -w 独立子进程静默读取,彻底根除进程内触碰外部应用 Keychain 项触发的 macOS SecurityAgent 密码弹窗。
    • 隔离与防护:自动化测试全程使用 FixtureHttp 内存 Mock 与沙箱临时目录,严禁真实外网连接;遵循 POSIX 0600 权限安全存储。

Bruce v0.12.1

Choose a tag to compare

@github-actions github-actions released this 19 Oct 03:59

Bruce 0.12.1 发布说明

调整与优化 (Changed)

  • Claude 订阅配置完整 cc-switch 化 (C059):Claude 登录态读取改为 Keychain 静默优先(kSecUseAuthenticationUISkip,绝不弹窗)→ ~/.claude/.credentials.json 文件回退;设置区升级为 Claude 专属区块(登录态状态行、零配置跟随、主操作行,粘贴入口收进「高级」);新增 RefreshPending 语义(access token 过期但 refresh token 存活时提示运行一次 Claude CLI 即恢复)。

修复 (Fixed)

  • Claude 订阅统计脱节 cc-switch 现行口径 (C058):新增 limits[] 模型专属周限额(weekly_scoped)解析与 Fable 窗口;坏窗口逐条跳过,不再因单条脏数据把整卡打成解析失败;双端周窗口标签保留模型后缀。
  • Claude 登录态自动读取仍偏离 cc-switch (C060):Claude Keychain 读取去掉外部来源白名单/状态门禁(拦截仅静默降级、不污染全局策略);凭据规范化完整保留 refreshTokenExpiresAt/subscriptionType/rateLimitTier/scopes 等字段;设置区恢复显式「从本机导入」入口。
  • Claude 订阅频繁 429:额度查询与本地刷新解耦 (C062):agentUsage 原先把本地会话扫描与全部订阅额度查询绑在同一次 run,5 分钟刷新间隔下 Claude usage 端点约 288 次/天;Claude 单独 429 仍按 5 分钟继续轮询,且全量 run 会用 error 覆盖上次窗口。现在未到期的 provider 跳过查询,全部未到期时执行 localUsageOnly 本地专用 run(不产生网络请求);429 后进入 30 分钟冷却,失败时保留上次窗口并标 stale;手动刷新与定向刷新强制查询并绕过冷却,窗口边界唤醒强制查询但尊重冷却;启动/激活在运行中或 60 秒内不重复触发。设置页文案同步说明额度查询周期。
  • 订阅刷新断网仍反复退避重试 (C061):全部订阅 Provider 共用的 agentUsage 刷新链路新增 NWPathMonitor 断网闸门。无网络时定时刷新、唤醒补偿与退避重试一律不启动 Collector、不排任何定时器,保留上次数据并提示「网络不可用, 已暂停自动刷新」;手动刷新(含单 Provider 定向刷新)仍可执行一次,但失败后不进入自动重试。网络恢复后只补偿一次刷新并恢复常规间隔,避免断网期间积压的重试在恢复瞬间叠加触发 Claude 等 Provider 的限流。同步更正设计基线 §7.2 中 429 重试间隔的文档漂移(15 分钟 → 实现值 300 秒)。

Bruce v0.12.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 10:11

Bruce 0.12.0 发布说明

调整与优化 (Changed)

  • 发版封箱归档首次执行 (v0.12.0):按 docs/archive/README.md 的 SOP 建立 docs/archive/0.12.0/,把 29 张 closed 变更卡(C015–C041,以及 v0.12.0 发布后回补并随本次封箱归档的 C056/C057)与 2 张 completed 任务卡(T05 Jev 适配、T06 ClinePass 适配)物理迁入,同步刷新 change/index.json 与 task/index.json 的 file 映射,并为两本总账各写入一份冻结快照。卡片内容一字未改;全仓 6 条指向卡片的 Markdown 链接(均指向仍留在 docs/devel/ 的 C001–C004)0 断链。说明:该 SOP 自 2026-09-23 写下后 16 个历史 tag 均未执行,本次为首度执行,故也一并收拢了此前已发版但未归档的 C015–C018(其自身 version 声明为 v0.11.3/0.11.4/0.11.5,原样保留);C001–C014 虽随 v0.9.0–v0.11.2 发布但状态仍为 verified 而非 closed,按「仅迁移 closed 卡片」留在原处。
  • 变更总账 topics[].changes 语义定稿 (TD-011 结清):把此前从未写明的口径写入 docs/devel/change/README.md §3.1 —— 下限(机器强制):数组必须包含所有以该设计文档为主设计文档的卡;上限(人工维护):允许登记「非主卡归属但确实改过该文档」的卡以实现跨文档多归属。新增 scripts/check-change-ledger.mjs 校验该下限与路径存在性,并接入 verify-local.sh,使此前导致 C039/C040/C041 脱节与 PricingEngine topic 整体缺失的这类漂移此后由门禁兜住。
  • README 精简与排版重构 (C054):仓库门面文档自 C001 Monorepo 重构(v0.10.0)后未同步实现,按预检实测存在 21 处失效路径引用(其中 8 个被引用路径在文件系统中已不存在)与整节死链。本次对齐 v0.11.5 现状并压缩排版,仅改动表述层,不涉及代码、脚本与设计基线规则:
    • 结构树与关键入口重写:顶层由 macos/BruceApp、bridge、rust/Bruce-collector、agent-usage 旧命名改为 apps/(macos / win / widget)+ core/collector/ 双层;关键入口更正为 apps/macos/Sources/BruceApp/BruceApp.swift、core/collector/bin/Bruce-collector/src/main.rs 与 core/collector/schemas/。
    • 文档索引去死链:「更多文档」7 条指向已归档的 docs/development/*.md,改为现行 ad-flow 入口(文档中心、设计基线 00~05、变更总账、部署指南、资源库)。
    • 命令路径修正:按需验证命令由 rust/Bruce-collector/Cargo.toml / --package-path macos/BruceApp 更正为 core/collector/Cargo.toml / --package-path apps/macos,并补 verify-rust.sh 跨平台入口与 15 个 Swift Harness 口径。
    • 安全模型描述对齐:订阅凭证存储由 macOS Keychain service 更正为 ~/Library/Application Support/Bruce/credentials.json(POSIX 0600 + 父目录 0700 + 临时文件原子替换 + 写后重读校验,含 C042 的损坏三态读语义)。
    • 能力清单补全:本机会话补齐至 10 个 Agent(Kimi Work / Kimi Code CLI / Claude Code / Codex / Grok / OpenCode / Orca / Pi / ZCode / CodeBuddy),订阅额度 10 家并标注 Cline 三窗口直读服务端权威端点(C039);补 43 款定价表规模、采集缓存 collector-cache-v1 与 Windows 数据位置。
    • 排版去重:合并重复的签名/公证叙述与架构图后冗余的 5 步运行链路列表,安全/隐私与数据位置并为一节;247 → 206 行。
    • 核验证据:README 内 18 条仓库相对引用经脚本解析全部可达(dead=0);Markdown 围栏 14 处平衡、表格 0 错列、7 处脚本引用全部存在;C054.json 与 change/index.json JSON 解析通过(总账 54 卡)。
    • 衍生发现(未在本卡修复):design/01 第 192 行称缓存位于 ~/Library/Caches/Bruce/collector-cache/,与实现 ~/Library/Application Support/Bruce/collector-cache-v1 不符,已登记 docs/devel/todo/now.md B-001 待单独建卡回写。

修复 (Fixed)

  • 发布产物并非 Universal 2 (C057):v0.12.0 发布后核对产物时发现,线上 Bruce.zip 解包后 Contents/MacOS/BruceApp 与内置 Contents/Resources/Bruce-collector 经 lipo -archs 实测均为 arm64 单架构(该 zip 的 SHA256 与 Release 上的 SHA256SUMS 校验一致,排除下载损坏),即 Intel Mac 用户拿到的产物无法启动 —— 而 AGENTS.md、design/01 的 NFR 与 README 均声明 macOS 侧具备 Universal 2(Apple Silicon + Intel Mac 原生)能力。根因:build-test-app.sh 的 --universal 能力自 v0.9.0 起就可用,但 CI 的两个构建步骤都未传该选项,流水线一直走单架构分支;而架构属性只在「构建 + 解包 + lipo」时才可见,push 级门禁只看编译通过,单架构产物照样全绿。修复:两个作业改以 --universal 构建、构建前显式 rustup target add x86_64-apple-darwin(该 target 是否预装随 runner 镜像而变),并新增「校验产物为 Universal 2」步骤对两个二进制分别断言双架构(App 与 Collector 分别构建,任一退化为单架构都会让对应平台无法启动)。设计基线新增 design/00 §3.3「发布产物规格」,并提炼纪律「凡只在 tag 场景被消费的产物属性(版本号 / 架构 / 文件名),必须在 push 级或流水线内附带断言」。产物已就地重打包:该修复生效后, 维护者授权拆除 tag、把 v0.12.0 重指到修复提交并重跑流水线, 故 v0.12.0 自身的产物已为 Universal 2 (详见本次发版的封箱说明)。
  • Windows 应用版本号脱离单一事实源 (C056):v0.12.0 发版后核对产物时发现,本应名为 Bruce_0.12.0_x64-setup.exe 的 Windows 安装包实际命名为 Bruce_0.11.5_x64-setup.exe,且该构建的应用内「版本」行会向用户显示 0.11.5。根因:apps/win/src-tauri/tauri.conf.json 的 version 自 v0.11.5 起一直硬编码,而 Windows 侧从未接入仓库根 VERSION 这一权威源(build-win-app.ps1 / upload-win-release.ps1 均不读取它,grep 零命中)—— 该字段同时决定 NSIS 安装包文件名与 get_runtime_info 返回的 package_info().version(即设置中心版本行)。macOS 侧不受影响(build-test-app.sh 读取 VERSION 注入 CFBundleShortVersionString)。修复:把 conf 版本对齐到 0.12.0,并在 scripts/check-win-frontend.mjs 新增 push 级一致性断言(conf 版本必须等于根 VERSION,不等即红灯)—— 此前该字段只在 tag 场景被消费,漂移可静默存活整个版本周期。红绿双向实测:conf 改回 0.11.5 → 退出码 1 并输出可定位诊断;恢复 → 退出码 0。另修正 README 两处不实的发布口径:原文称 CI「产出未签名 Preview 草稿 Release」,实际 upload-win-release.ps1 在两端产物齐备后执行 draft=false + make_latest(v0.12.0 实测 08:20:42Z 建草稿、08:43:31Z 转为公开),现按两段式如实描述。设计基线 05-§6.4 同步新增「应用版本号单一事实源」条与纪律「凡 tag 场景才消费的字段,必须在 push 级至少校验其与权威源的相等性」。
  • 设计基线与 UI 的本机数据落盘事实校正 (C055):由 C054 的衍生发现复核扩大而来的同类失真批次 —— 设计基线与用户界面中关于「缓存根 / 配置文件名 / 快照文件名」的表述从未与实现对齐,且全部系自诞生即错(非重构失同步)。逐项:
    • design/01 §7.1 缓存持久化三条断言全部失真:(a) 路径 ~/Library/Caches/Bruce/collector-cache/ 从未存在过 —— C001 重构之前的代码(b2b580e^)已是 ~/Library/Application Support/Bruce/collector-cache-v1,全仓零 Library/Caches,且 App 侧无能力覆盖该值(collector-application 恒调 default_cache_root,仅 Windows 壳注入且注入同值)。(b) 字段名 last_byte_offset / parsed_turn_count / bucket_deltas 在全部 git 历史中零命中(git log --all -S 唯一次命中即 C001 引入该正文本身,对照组 safe_offset 命中 6 次),且模型实为 C021 起的源级缓存。(c) 「版本升级时自动淘汰旧缓存文件」实为「身份失配即忽略条目并重建」,文件删除只发生在源文件从源路径集合消失时。现按实现重写为「位置(default_cache_root 双平台真值)+ 四层缓存表(Kimi Code CLI 专用 / JSONL 源级 / SQLite 源级 / Codex 树缓存,各自 schema 常量、覆盖源与身份判定)+ 复用与版本迁移」,并声明「字段全集以代码为准,不做逐字段镜像」以免再次腐化。
    • design/04 五处 config.json 不存在:真值为 config/onboarding-v1.json(OnboardingConfiguration.configURL,AtomicJSONStore 0600 文件 / 0700 目录)。简介、NFR、时序图 participant 与 store 消息、§3 单价覆盖契约五处一并更正。
    • design/00 快照文件名不存在:snapshots/current.json / snapshots/previous.json 真值为按模块分文件 <module>.json / <module>.previous.json(当前唯一模块 agent-usage,本机 snapshots/ 目录实测为 agent-usage.json / agent-usage.previous.json / agent-usage.json.backup.json),并补记 AtomicJSONStore 写入前备份与旧 schema 迁移备份两条旁路副本。
    • design/05 待办表述过期:§6.1 的 R1(缓存根平台化)/ R2(Windows CI job)/ R3(verify-rust.sh 抽取)均已实施,现补「实施状态」列并注明 R4 真机实测仍欠账、R5 走了壳侧 CredentialPayloads 注入的替代路线;§8 去掉会随文件增长漂移的 文件:行号 改为符号锚点;§3.1 显式标注为 v0.9.0 / 0a7f2e2 的时间点存档并加「后续落地」注记,避免其结论列被误读为现状。
    • Windows 侧顺带修掉一个真实渲染缺陷:设置中心说明卡的展示路径字面量 "%APPDATA%\Bruce\config\settings.json" 中 \B / \c / \s 是 JS 无效转义、反斜杠会被丢弃 —— node -e 实测求值为 %APPDATA%Bruceconfigsettings.json,Windows 用户一直看到残缺路径(同文件另有 :48、:761 两处写法正确,仅此一处疏漏)。现修正转义并把标签一并对齐为 settings.json;mac 侧标签由 config.json 改为 onboarding-v1.json。apps/win/tests/frontend.test.mjs 新增两条断言锁定标签与完整路径(该文案此前无任何测试覆盖,故长期未被发现),测试标题同步为 settings json。
    • 变更总账挂接补齐:C039/C040/C041 的卡条目已声明 topic 却未登记进对应 topics[].changes,现补齐;design/04 回链的 PricingEngine topic 在 index.json 中根本不存在,现新增(changes = C001/C002/C052/C055,即 git 历史与本卡实测确认改过该文档的卡)。跨文档归属语义(「主卡归属」vs「改过即登记」)现行两种混用,已登记 future.md TD-011 待定稿后全量重算,未擅自定名。
  • 全仓对抗性审查缺陷批次修复 (C042–C052):2026-10-16 对主干做了一次全仓对抗性审查(覆盖 41 张已闭环变更卡 + 19.1k 行 Rust + 52.4k 行 Swift + 9.3k 行 Windows),按「有真实失败路径」优先的次序立项 12 张卡并完成 10 张修复(另 2 张为结构性债,已登记 future.md TD-005/TD-006 待独立开批)。逐卡要点:
    • C042 凭据文件存储加固(数据丢失路径):ProtectedFileCredentialStore.loadPayloadLocked 原以 try? 把任何读/解码失败折叠为空 payload,而 saveCredential 是「读全量 → 改一个 key → 整体覆盖写」——文件一旦损坏,用户下次保存任一凭据即永久抹除其余全部凭据(无备份无回滚)。现读路径改为三态(不存在→空 / 损坏→保留现场副本后抛 corrupted / 正常→解码);写路径对齐 AtomicJSONStore 规格:createFile(0600) → write → synchronize → 重读解码校验 → 备份 .bak → replaceItemAt → 复位 0600 且失败即抛;目录存在时也校正为 0700。新增两条 Harness 用例(损坏不被静默抹除 / 写入加固),BruceOnboardingCoreHarness 165 项全绿。
    • C043 消除生产 panic 路径(进程硬崩路径):sqlite_cache.rs 增量合并路径的 CompactContribution::from_domain(...).expect(...) 在窗口不匹配时会 panic(而窗口身份错位正是 C040 认定「现实中会发生」的情形);collector-application 的三处 join().expect 会把 worker panic 升级为主线程 panic;bin/Bruce-collector 无兜底 → panic 时 stdout 无任何 JSON envelope,宿主只看到非零退出码。现缓存编码失败回退为「跳过写条目 + 计 cache_corruptions」(与 C040 语义一致),worker 失败降级为 COLLECTOR_WORKER_PANICKED 诊断,入口改用 run_bytes_panic_safe(catch_unwind 兜底输出 BRIDGE_INTERNAL_PANIC error envelope);Windows 侧采集入口同步切换(apps/win/src-tauri/src/collector.rs 原直调 run_bytes)。collector workspace 138 项全绿(基线 132)。
    • C044 面板隐藏态可见性门控补齐:项目曾因「隐藏面板动画不暂停致 ~40% CPU」建立 DashboardPanelAnimationPolicy,但只覆盖 hero/heatmap 两条路径。实测遗漏三处:订阅卡定向刷新 ProgressView(未透传 panelVisible,而定向刷新最长 90s)、SuppressorView 的 0.3s 看门狗(面板 orderOut 不触发视图离窗 → 首次打开后 Timer 终身运行)、小时卡柱体生长 .task(绕过策略)。现三处全部纳入策略并加断言(allowsRefreshProgress / allowsHourlyGrowth / allowsSuppressorWatchdog),NativeLifecycleHarness 14 项含 7 条新门控断言。
    • C045 目录递归防护统一(栈溢出风险):同仓 walk_jsonl_tree 有深度上限 + 已访问集合与 symlink 环测试,而新增的 jsonl_cache::visit_tree 与 sources.rs::collect_codex_files 两样都没有。现 MAX_DIRECTORY_SCAN_DEPTH 收敛为单一 pub(crate) 常量、四个 walker 共用双护栏;新增用例以 files_visited 计数锁定护栏有效性(红绿验证:撤掉深度检查 → 用例 FAILED left:2 right:1;恢复 → 全绿)。用例注释同时如实记录实测事实:symlink 环在 macOS 被内核路径长度限制拦截,故断言对准深度上限而非「环致崩溃」。
    • C046 静默吞错改为故障可见:finalize_local_agent 原 let _ = accumulator.merge_delta(...) 吞掉合并失败而 agent 仍报 ok(用量静默丢失,且与 aggregation.rs 同类失败产诊断的口径自相矛盾)→ 现降级 partial 并说明「数据不完整」;次要源 I/O 错误原完全静默 → 现产出信息级 LOCAL_SOURCE_IO_DEGRADED(区分「源不存在」与「读取失败」);Codex 树缓存解码异常原静默 → 现计 cache_corruptions 并在 note 说明;mac 侧 ProviderAccountStore.loadIndex/loadRecord 解码失败原返回空索引/nil(空索引被后续 saveIndex 覆盖会使遗留记录成孤儿)→ 现抛 ProviderAccountStoreError,removeAllAccounts 失败上抛。新增 3 条用例(Rust partial 降级 / Swift 索引与记录损坏 fail-closed,含「损坏原文未被覆盖」断言),SubscriptionCredentialsHarness 33→35 项。
    • C047 缓存写盘权限口径统一:sources.rs 的 Codex 树缓存是仓内唯一用 File::create 继承 umask 的缓存写盘,现改为 create_new + 显式 0600。三个同名辅助函数(fingerprint_range/append_is_safe/ends_with_newline)经核实分属两套不同签名类型,机械合并需先统一类型契约,已登记 TD-004 并入 C053 结构重构。
    • C048 provider 专属逻辑下沉(已登记待实施):execution.rs 的 app == "codex" 分支、resolve_credential 的 claude/grok 硬编码、codexQuotaRetryOnly 编排层短路等,改法已定(provider 层标准化输出 ProviderOutcome),但触及刚经 C037/C041 验证的 codex 重试/降级路径,需独立回归窗口 → 登记 TD-005,卡状态 open。
    • C049 provider 映射表单一事实源:前缀字符串原在 CATALOG_SPECS / ACCOUNT_FIELDS / account_prefix 三处手工重复且无编译期约束 → 现 CatalogSpec 增加 credential_field 并对外暴露 catalog_entries() 投影,collector-application 全部派生、删除两份手写映射;新增 catalog_entries_are_complete_and_unique 一致性用例(10 条目齐备唯一 + 关键前缀逐字抽查)。
    • C050 截断文案失真:C041 把上限从 1 万改 3 万时漏改 opencode 诊断文案(仍写「最新 10000 条」),现 opencode 与 zcode 两...
Read more

Bruce v0.11.5

Choose a tag to compare

@github-actions github-actions released this 14 Oct 07:34

Bruce 0.11.5 发布说明

新功能 (Added)

  • 统一余额型订阅仪表盘展示规范为双槽对称流并暂时屏蔽 Jev (C018):
    • 仪表盘双槽对称流 (方案 B): 为 DeepSeek 等按量计费/余额型订阅重构正文布局,标头移出拥挤的 BalanceChip,正文平铺为 50/50 规整双槽(左槽为大号等宽粗体「可用余额」,右槽为「本月消费」及覆盖区间说明,若无账本则显示「订阅状态」);Classic/LiquidGlass 适配微透明平滑圆角磨砂槽,Nothing 主题适配 3pt 方角、透明底加强边框与 Space Mono 字体。
    • 界面暂时屏蔽 Jev: 因 TypeSafe 官方未开放免费查询剩余额度的公开 API,在 SettingsView 与 SubscriptionPresentationPolicy 中暂时隐藏 Jev 显示与配置入口,避免无官方查额接口对用户造成误导;底层 Collector 解析、凭据存储及全部 168 项安全测试 100% 完整保留。
  • TypeSafe Jev 订阅额度监控与多模型计费全链路适配 (T05 & C017):
    • Core Collector: 内置 TypeSafe Jev 模型定价(jev-1.13.0, jev-1.13, jev-latest, jev-preview),基准单价输入 $0.042/1M tokens ($42/1B),输出免费;实现 JevProvider 出站探测 GET https://api.typesafe.ai/v1/models,自动解析活跃模型列表与速率限额(100k tok/s, 80 req/s),标准化映射 401 凭证失效与 429 限流退避。
    • 凭据白名单与安全传输: 扩充 ALLOWED_CREDENTIAL_FIELDS 白名单与 request-v1.schema.json,支持 jevQuotaAccounts 安全注入与 POSIX 0600 凭据权限隔离。
    • macOS 原生设置中心与看板卡片: BruceOnboardingCore 与 BruceApp 接入 Jev API Key 单一凭据配置弹窗(console.typesafe.ai 快捷引导)、即时连通性校验(reverify)、品牌色 #e551ba 与 System One 决策模型专属配额卡片渲染;补全全量 Harness 测试(168 项用例)。

Bruce v0.11.4

Choose a tag to compare

@github-actions github-actions released this 14 Oct 02:47

Bruce 0.11.4 发布说明

修复 (Fixed)

  • Windows 任务栏托盘弹出位置偏离与静态坐标死锁修复 (C016): 修复点击托盘图标位置错位、钻入任务栏后方或多屏切换后失效的缺陷。彻底废弃历史失焦时写入 settings.json 并永久死锁面板坐标的旧逻辑;改为基于 Win32 操作系统底层真实的 monitor.work_area() 工作区(自动扣除任务栏占用)与 Tauri 2 托盘点击物理 rect,动态计算贴靠位置(底部任务栏上方 10px / 顶部任务栏下方 10px),并居中对齐托盘图标与安全边缘钳制;支持 Windows 10/11 任意任务栏停靠位置与多显示器负坐标环境。
  • 多分辨率与高 DPI 缩放仪表盘高度自适应 (C016): 修复 tauri.conf.json 写死高度 760 导致在 1080p 150% 缩放笔记本(可用逻辑高度仅 688px)及 1366×768 屏幕下窗口超出屏幕下界、底栏设置与退出按钮不可见的严重 Bug。实现纯函数 compute_dashboard_geometry 动态根据工作区可用高度自适应降高(留出上下各 10px 安全边距),开启 resizable: true 支持程序级尺寸适配。
  • 消除前端 CSS Flex 截断与细滚动条优化 (C016): 修复 styles.css 中 #scroll 缺少 min-height: 0 导致的 Flex 规范下子项拒绝收缩并挤出底栏的缺陷;为 #scroll 注入 flex: 1 1 0; min-height: 0; 并配备 4px 细致半透明滚动条;为 #footer 显式设置 flex: 0 0 auto;,底栏齿轮设置与退出按钮永久绝对锁定在可视区底端。
  • 交付 Windows 任务栏高保真交互与多分辨率模拟 Demo: 更新 apps/win/demo/win-taskbar-interaction-demo.html,新增 1080p 100%、1080p 150%、1366×768、2K 125%、4K 200% 分辨率切换与顶部/底部任务栏切换,并实时渲染几何 Telemetry 状态参数与挂靠对齐效果。