fix(web): 顶栏 token 计量栏回复后不刷新 + bump 0.22.1

提问→助手答完后,对话顶栏「总 token·缓存命中·花费」停在发问前旧值,
要切走再切回才更新。根因:计量栏读 state.taskMeta,而它只在 selectTask
里重拉;SSE 收尾的 fetchSse finally 只刷列表+消息,从未重拉 meta。
修:finally 里当收尾的是当前可见 task 时补一次 GET /v1/tasks/{id} →
重置 state.taskMeta → renderChatMeta(),失败 try/catch 吞掉不打断收尾。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
caoqianming 2026-06-24 09:08:19 +08:00
parent 528b974d9f
commit c569438d5f
3 changed files with 13 additions and 1 deletions

View File

@ -21,6 +21,12 @@
## 已完成关键能力
### 2026-06-24 / 修复顶栏 token 计量栏回复后不刷新(bump 0.22.1)
- 现象:提问→助手答完后,对话顶栏的「总 token · 缓存命中 · 花费」计量栏停在发问前旧值,要切到别的 task 再切回才更新。
- 根因:计量栏由 `renderChatMeta()``state.taskMeta` 渲染,而 `state.taskMeta` 只在 `selectTask``GET /v1/tasks/{id}` 时刷新。SSE 流结束后 `fetchSse` 的 finally 只 `loadTaskList()`(左栏列表)+ `loadMessages()`,从未重拉 meta 也没调 `renderChatMeta`——SSE 期间用量只累计进 hint,没落 taskMeta。
- 修:`fetchSse` finally 块里,当收尾的是当前可见 task 时补一次 `GET /v1/tasks/{id}` → 重置 `state.taskMeta``renderChatMeta()`;失败 try/catch 吞掉不打断收尾。`web/static/js/chat.js`。
### 2026-06-24 / 微信接入第一期:ClawBot 个人微信(后端完成,bump 0.22.0)
- 需求:把 zcbot 送进用户**个人微信**——能对话、能推简报/结果。调研三条路:wechaty/hook(违规高封号,排除)、企业微信自建应用(官方但要管理员+仅企业成员)、**微信 ClawBot**(腾讯 2026-03 官方个人号 Bot API,iLink 协议,零封号,后端接谁都行)。选 ClawBot 先行。详 DESIGN §8.7。

View File

@ -1,3 +1,3 @@
# zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。
# 改版本只动这一行。
__version__ = "0.22.0"
__version__ = "0.22.1"

View File

@ -1241,6 +1241,12 @@ async function fetchSse(url, run) {
// 刷新 task meta + messages(拿真实持久化的);失败路径已退出,这里不再跑
loadTaskList();
if (state.taskId === ctx.taskId) {
// 重新拉 meta:SSE 期间 token/缓存命中/花费只累计进 hint,未落 state.taskMeta,
// 顶栏计量栏会停在发问前的旧值,直到切走再切回才更新 — 这里补一次让它即时刷新。
try {
const meta = await api("GET", "/v1/tasks/" + ctx.taskId);
if (state.taskId === ctx.taskId) { state.taskMeta = meta; renderChatMeta(); }
} catch (e) { /* meta 刷新失败不致命:保留旧值,不打断收尾 */ }
await loadMessages();
refreshOutline(); // 本轮新增 user 提问 → 目录补一条
loadFiles(); // 回复结束后右侧文件面板同步刷新(可能有新写入 / 修改的产物)