Skip to content

v2026.09.13.3

Choose a tag to compare

@westsource westsource released this 13 Sep 11:18
· 48 commits to main since this release

v2026.09.13.3 — 会话最后活动时间由服务端按消息派生

客户端发布:CLIENT_VERSION 2026.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 slot updatedAt、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),落地点:workbuddy updated_at+last_activity_at(去掉 now 钳制,仅保留 ≥ created_at 下界)、omp title slot updatedAt、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」。