Skip to content

fix(desktop): restore complete account quota display - #3318

Open
fico-hub wants to merge 1 commit into
makecindy:mainfrom
fico-hub:fix/usage-db-client-owner
Open

fix(desktop): restore complete account quota display#3318
fico-hub wants to merge 1 commit into
makecindy:mainfrom
fico-hub:fix/usage-db-client-owner

Conversation

@fico-hub

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

修复桌面端 Claude、Codex 等订阅额度在冷启动或稀疏更新后显示不完整的问题。

  • 额度快照的持久化与恢复改用当前 DbClient owner,避免 legacy localDb 关闭后丢失账号上下文。
  • Codex app-server 的 primary / secondary 窗口按字段合并,单窗口稀疏事件不再清掉另一窗口。
  • Codex Web 用量请求改用 Electron net.fetch,遵循系统代理和 PAC 配置。
  • 增加 main、renderer 和额度 chip 的回归测试,覆盖 Claude / Codex 双窗口完整展示。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:本机复现,暂无公开 Issue
  • 本 PR 包含:desktop 订阅额度快照 owner、Codex 窗口合并、Codex Web 请求传输层及相关测试
  • 明确不包含:服务端额度策略、额度窗口推断、移动端 UI、数据库 schema 或 migration
  • 用户可见变化:重启或额度事件更新后,右下角会稳定显示上游实际返回的全部额度窗口
  • 是否存在 breaking change:无

UI 变化

不涉及:本 PR 只修复额度数据的恢复、合并和请求链路,不改现有 TodaySpendChip 的样式、交互或文案;UI 仍使用原有结构与设计 token。

  • 引用的设计规范:不涉及;无视觉、交互或文案变化

怎么验证的

自动验证

pnpm test:unit:related
结果:PASS apps/desktop unit (43.2s)

pnpm --filter desktop run --if-present typecheck
结果:通过

pnpm --dir apps/desktop exec eslint <本 PR 的 9 个 TypeScript/TSX 文件>
结果:通过

pnpm check:dco
结果:DCO check passed: 1 commit signed off

手工验证

  • macOS arm64:使用隔离 userData 和真实账号数据库的只读副本冷启动本地打包应用。
  • 在 1038px 窗口中,Claude 同时完整显示 4 小时额度与当前模型周额度,无裁切或内部溢出。
  • Codex 完整显示当前权威接口返回的周额度;接口只返回一个窗口时不虚构第二窗口。
  • 已验证应用打包、ad-hoc 签名和启动。

未执行的验证

  • 未执行全量 pnpm test:unit;仓库要求的相关测试门禁已通过,完整矩阵交由 CI。
  • 未在 Windows / Linux 做手工 UI 验证;改动不涉及平台样式,网络层改为 Electron 跨平台 API。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:desktop 主进程的订阅额度快照持久化、Codex Web 请求,以及 renderer 内的 Codex 快照合并。
  • 用户数据:只读写现有 account_usage_snapshots 行,不改变 schema;DbClient owner 继续沿用当前已验证账号边界,不会回退到已关闭的 legacy owner。
  • 跨平台差异:net.fetch 使用 Electron/Chromium 网络栈,在 macOS、Windows 和 Linux 上统一遵循 Electron 代理配置;自定义 fetchFn 注入行为不变。
  • 回滚 / 降级方式:回滚本提交即可恢复旧逻辑;请求失败仍按现有降级路径隐藏不可用额度,不影响会话数据。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档(本次无外部契约变化,无需额外文档)
  • 已确认测试结果或说明未执行原因

Signed-off-by: fico-hub <fico@xd.com>
@fico-hub
fico-hub requested a review from a team as a code owner August 24, 2026 02:33
@greptile-apps

greptile-apps Bot commented Aug 24, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 修复桌面端账户额度快照在冷启动及稀疏更新后的不完整展示。

  • 使用当前 DbClient 的 owner 恢复和持久化账户额度快照
  • 按字段合并 Codex app-server 的 primary/secondary 稀疏窗口
  • 使用 Electron net.fetch 请求 Codex Web 用量以遵循系统代理配置
  • 补充主进程、renderer 与额度展示组件的回归测试

Confidence Score: 5/5

本 PR 看起来可以安全合并,未发现由本次改动引入的具体可达故障。

当前 DbClient owner、Codex 分桶与过期清理逻辑共同维持账户和限额桶边界,稀疏窗口合并保留缺失 sibling 的同时仍允许 WHAM 完整快照及 reached marker 清窗;Electron 网络调用也仅从兼容的主进程路径触发。

Important Files Changed

Filename Overview
apps/desktop/src/main/usageBroadcaster.ts 将快照 owner 切换到当前 DbClient,并在同一 Codex app-server bucket 内逐字段保留稀疏更新未携带的额度窗口;未发现本次改动引入的可发布缺陷。
apps/desktop/src/main/usage/codexWebUsage.ts 默认网络实现由 Node fetch 改为 Electron net.fetch,当前调用路径和 Electron 版本与该 API 契约一致。
apps/desktop/src/renderer/hooks/useAccountUsage.ts Renderer 采用与主进程一致的 Codex 稀疏窗口合并语义,并保留 WHAM 完整快照及 reached marker 的清窗行为。
apps/desktop/src/main/tests/usageBroadcasterCodexAccount.test.ts 新增 DbClient owner 恢复及单窗口稀疏更新保留 sibling 窗口的回归覆盖。
apps/desktop/src/renderer/components/status/tests/TodaySpendChip.popover.test.tsx 新增 Claude 与 Codex 多窗口额度完整渲染的组件级回归覆盖。

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[Codex app-server 稀疏事件] --> B[主进程按 bucket 合并窗口]
  C[Codex Web 用量请求] -->|Electron net.fetch| D[WHAM 完整快照]
  B --> E[持久化到当前 DbClient owner]
  D --> E
  E --> F[广播账户额度快照]
  F --> G[Renderer 合并与选择额度桶]
  G --> H[TodaySpendChip 完整展示]
Loading

Reviews (1): Last reviewed commit: "fix(desktop): restore complete account q..." | Re-trigger Greptile

@MagicLizi MagicLizi added touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) awaiting-discussion 等待维护者讨论(review-pr) and removed awaiting-discussion 等待维护者讨论(review-pr) labels Aug 24, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/desktop/src/renderer/hooks/useAccountUsage.ts)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范。本条不阻断合并。

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) and removed awaiting-discussion 等待维护者讨论(review-pr) labels Aug 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants