Skip to content

修复后台用量线程刷新后 UI 未同步更新的问题#186

Open
MDX-Tom wants to merge 4 commits intoqxcnm:mainfrom
MDX-Tom:main
Open

修复后台用量线程刷新后 UI 未同步更新的问题#186
MDX-Tom wants to merge 4 commits intoqxcnm:mainfrom
MDX-Tom:main

Conversation

@MDX-Tom
Copy link
Copy Markdown

@MDX-Tom MDX-Tom commented May 6, 2026

变更摘要

  • 修复“账号管理”页面停留期间无法在后台用量轮询完成后立即刷新额度条的问题
  • 将刷新策略从前端定时探测调整为事件驱动:用量轮询批次一结束,Service 立即通知 Tauri,Tauri 再通知前端账号页刷新
  • 保留用量列表短间隔刷新作为兜底,但主路径不再依赖页面切换或下一轮前端定时器
  • 补充前后端回归验证,覆盖“收到用量轮询完成事件后,账号页立即重拉并更新额度条”的关键路径

改动范围

  • Frontend
  • Desktop / Tauri
  • Service
  • Gateway / Protocol Adapter
  • Docs / Governance
  • Workflow / Release

主要文件

  • crates/service/src/usage/refresh/mod.rs
  • crates/service/src/usage/refresh/batch.rs
  • crates/service/src/usage/usage_refresh.rs
  • apps/src-tauri/src/lib.rs
  • apps/src/lib/api/usage-refresh-events.ts
  • apps/src/hooks/useAccounts.ts
  • apps/tests/accounts-usage-auto-refresh.spec.ts

主要改动

  • Service 层新增 UsageRefreshCompletedEvent 与完成回调注册能力,用量轮询批次、批量手动刷新、单账号刷新完成后都会发出刷新完成通知
  • 用量轮询线程在 refresh_usage_for_polling_batch 返回前触发 notify_usage_refresh_completed("polling", processed, total),确保后台轮询一完成就产生前端可消费的信号
  • Tauri 启动时注册 Service 回调,并通过 usage-refresh-completed 事件广播给前端窗口
  • 前端新增 listenUsageRefreshCompleted,桌面端监听 Tauri 事件,测试环境支持同名 CustomEvent
  • 账号页收到事件后立即 refetch 活跃的账号列表与用量列表,并失效用量汇总、今日摘要和启动快照缓存
  • 回归用例改为显式派发 usage-refresh-completed 事件,并要求页面在 2 秒内从旧额度更新到新额度,避免再依赖 5 秒兜底轮询

实现效果

  • “用量轮询线程”完成一次批次刷新后,正在停留的“账号管理”页面会立即重拉账号与用量数据
  • 多账号场景下不再依赖“最新一条快照”判断,因此不会因为其他账号快照时间更晚而漏刷新当前账号额度条
  • 页面切换仍会触发原有数据刷新,但不再是看到最新额度的必要条件

验证

  • pnpm -C apps run test
  • pnpm -C apps run build
  • pnpm -C apps run test:ui
  • cargo test --workspace
  • 其他本地验证已说明

已执行的实际验证:

pnpm -C apps run build:desktop
pnpm -C apps run lint
pnpm -C apps run test:runtime
PLAYWRIGHT_BROWSERS_PATH=/private/tmp/codex-ms-playwright pnpm -C apps exec playwright test tests/accounts-usage-auto-refresh.spec.ts
PLAYWRIGHT_BROWSERS_PATH=/private/tmp/codex-ms-playwright pnpm -C apps exec playwright test tests/accounts-usage-auto-refresh.spec.ts --repeat-each=2
PLAYWRIGHT_BROWSERS_PATH=/private/tmp/codex-ms-playwright pnpm -C apps exec playwright test tests/accounts-usage-auto-refresh.spec.ts --repeat-each=3
cargo fmt --all --check
cargo test -p codexmanager-service usage_refresh_completed_handler_receives_notification
cargo test --workspace
cargo tauri build --bundles app
codesign --verify --deep --strict --verbose=2 apps/src-tauri/target/release/bundle/macos/CodexManager.app
hdiutil verify apps/src-tauri/target/release/bundle/dmg/CodexManager_0.2.8_aarch64.dmg

未执行的验证与原因:

pnpm -C apps run test:apps/package.json 当前没有 test 脚本;已执行 test:runtime、build:desktop、lint 与目标 Playwright 回归。
pnpm -C apps run test:ui:apps/package.json 当前没有 test:ui 脚本;已按文件连续执行账号页自动刷新 Playwright 回归。

补充说明:

pnpm -C apps run lint 通过,当前仅输出仓库既有 warning,无 error。
最新 DMG SHA256:364c13838c915c3cfff355a4d029ee1570fd5a499cfed225008cf5099cf546f8

风险与影响面

  • 影响面覆盖 Service 后台用量刷新、Tauri 事件广播和账号页前端查询刷新
  • 新增事件只在用量刷新完成后广播,不改变后端存储结构、RPC 接口入参或现有用量数据格式
  • 账号页仍保留短间隔用量列表刷新作为兜底;即使事件监听不可用,页面仍能通过原有查询机制更新

备注

  • 提交前请确认未包含敏感 token、cookie、API key

@qxcnm
Copy link
Copy Markdown
Owner

qxcnm commented May 6, 2026

先不合并。

我本地拉了这个 PR 做关键路径验证,新增的回归用例连续两次失败:

pnpm exec playwright test tests/accounts-usage-auto-refresh.spec.ts

失败点一致:账号页初始能看到旧用量 85%,但 8 秒内没有刷新到新用量 60%:

Expected: visible
Locator: ... getByText('60%', { exact: true })
Timeout: 8000ms
Error: element(s) not found

PR 当前虽然是 MERGEABLE/CLEAN,也没有冲突,但没有 CI checks,而且自带的 Playwright 回归没有通过。请先修复自动刷新触发逻辑或测试时序,保证这条用例稳定通过后再合并。

@MDX-Tom
Copy link
Copy Markdown
Author

MDX-Tom commented May 7, 2026

已更新pr说明,并在本地编译生成.app经人工测试验证能够完成用量UI自动刷新。

MDX-Tom added 2 commits May 7, 2026 17:40
将刷新策略从前端定时探测调整为事件驱动:用量轮询批次一结束,Service 立即通知 Tauri,Tauri 再通知前端账号页刷新,同时保留用量列表短间隔刷新作为兜底
@MDX-Tom
Copy link
Copy Markdown
Author

MDX-Tom commented May 8, 2026

已更新pr说明,并在本地编译生成.app经人工测试验证,提高了用量UI自动刷新的稳定性。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants