Repository navigation
v2026.09.13.3
v2026.09.13.3 — 会话最后活动时间由服务端按消息派生
客户端发布:
CLIENT_VERSION2026.09.13.2 → 2026.09.13.3(客户端包有改动,各端经/api/client/manifest自动更新,Agent 重启后生效)。服务端有 schema 变更:新增sessions.last_activity_at(可空,启动时幂等 ALTER 建列),存量行由scripts/backfill-last-activity.py一次性回填(生产已执行 691 行)。
Fixed(拉取到本机的会话"最后更新时间"是同步时刻,不是最新消息时间)
- 现象:从远端同步下来的会话在本地一律显示成"刚刚"。WorkBuddy 列表按
COALESCE(updated_at, created_at)排序 → 一次同步把被触碰的会话全部塌到同一个时间戳并顶到最前(实测本机workbuddy.db:6 行最近被触碰的会话updated_at全等于同步时刻,而其最新消息分别在 08-21 / 08-29 / 09-03);Hermes 桌面端的last_activity_at对同步创建的会话是 NULL;omp 的 title slotupdatedAt、OpenClaw 索引的updatedAt/lastInteractionAt/lastActivityAt都恒写now。 - 根因:
last_activity_at不在 canonical 模型里,各 adapter 只能拿ended_at,而它各 agent 语义不一致(2026-09-13 实测 40 条拉取会话:5 条缺失、只有 3 条等于最新消息时间);workbuddy 的写入路径还把值max(..., now)钳到同步时刻(来自最初的 adapter 提交,无注释、无测试守住)。 - 修复(服务端派生 + 客户端消费):
sessions.last_activity_at= 最新一条可见消息的timestamp,由server/sync.py::push从本次载荷的消息派生(客户端同名字段被覆盖;无消息的元数据型 push 透传客户端值,不清空)。mcp/adapters/base.py新增共享助手session_last_activity()(服务端值 → 最新消息 →ended_at→now),落地点:workbuddyupdated_at+last_activity_at(去掉 now 钳制,仅保留 ≥ created_at 下界)、omp title slotupdatedAt、openclaw 索引三字段(并读回lastActivityAt)、hermes 零代码改动(state.db本就有该列,进 canonical 后 1:1 映射)。opencode(已用ended_at)/dsh/reasonix(无该元数据)/chatgpt(只读)不改。 - 存量回填:
scripts/backfill-last-activity.py(dry-run 默认 /--apply/ 幂等 / 只看可见消息)。 - 验证:本机真实 store 重新落地一条 08-21 的会话 →
updated_at/last_activity_at= 08-21 22:44:27(其最新消息时间),同步发生在 09-13 19:01;生产回填 691 行、复跑 0 改动;线上/pull抽样 25 条:24 条与MAX(m.timestamp)完全相等、0 条不符、1 条无可见消息(NULL,按设计)。mcp 套件 195 项、server 套件 196 项通过(仅 3 项改动前既有的环境失败)。
生产状态:236 已部署 2026.09.13.3(9 文件 sha256 与工作区一致、systemctl restart 后 health 200),线上 /api/client/manifest 服务该版本,发货 zip 含新代码。决策记录:ARCHITECTURE「会话最后活动时间(last_activity_at)」;运维说明:OPERATIONS「Session Last Activity」。