V4.0.9
V4.0.9 修复 Issue #130:安装 hook 后,Feishu/Lark WebSocket 可能停止接收消息,并在周期性断连后触发 Gateway 重启循环。
根因
- Hermes 建立 WebSocket 时,Lark SDK 会保存一个完整的
EventDispatcherHandler,其中包含消息、卡片、reaction、bot 生命周期、drive 和 meeting 等 processor。 - 旧 HFC startup hook 在连接已经建立后再次调用
_build_event_handler(),并直接替换adapter._event_handler与 livews_client._event_handler。 - 这是 HFC 对已连接 Lark WS client 内部状态的唯一写入;它改变了 SDK receive loop 后续处理消息时使用的 handler identity,与 Issue #130 中“装 hook 后不再收到消息、移除 hook 后恢复”的 A/B 一致。
- 周期性 close 后的 reconnect exhaustion 是 Hermes 上游独立问题 NousResearch/hermes-agent#64712/#64741;V4.0.9 不接管 Hermes 的 reconnect ownership,而是移除 HFC 自身的 live-handler 风险写入。
修复
- 不再重建或替换任何 live
EventDispatcherHandler。 - 仅定位既有 handler 中的
p2.card.action.triggerprocessor,更新它的 callback,使 slash/model/resume/operations 等 HFC 原生按钮继续返回内联卡片。 - WebSocket 模式通过 adapter 的
_ws_thread_loop.call_soon_threadsafe(...)在 SDK 自己的线程更新 callback,避免跨线程改写 live handler。 - 如果未来 Lark SDK 改变内部 processor 结构,HFC 会 fail-open 跳过 callback refresh,不会回退到整体 handler 替换。
贡献
- 感谢 @Jasonsun77 提供 Issue #130 的 Linux clean-versus-patched A/B、3–6 分钟断连时间线、Python/Lark/websockets 精确版本、sidecar 健康证据,以及上游 reconnect issue/PR 关联。
验证
- TDD 回归证明旧实现会重建 live handler,新实现保持 adapter 与 WS client 的 handler identity 不变。
- hot-file 矩阵:
404 passed, 1 skipped;skip 是默认测试环境未安装 Hermes 可选 Feishu SDK。 - Python 3.11.15 +
lark-oapi==1.6.8+websockets==15.0.1精确兼容 smoke 通过。 - 完整自动化:
1330 passed, 4 skipped,并通过git diff --check。 - 真实 Hermes v2026.7.7.2 / Feishu WebSocket:pre-idle 消息、420 秒空闲、post-idle 和额外 liveness 消息全部完成;Gateway/sidecar PID 保持稳定,sidecar 10/10 个事件全部应用,3 次发送与 7 次更新成功、失败为 0。
/modelProvider 回调原位进入模型列表,Bailey 随后手动切换模型并确认成功;没有 callback timeout。- sdist/wheel 构建成功;干净 Python 3.12 环境从 wheel 导入
hermes_feishu_card==4.0.9且 CLI 入口可用。 - GitHub Actions 新增 Ubuntu/Python 3.11 精确 SDK job;四个公开资产 checksums 与公共
v4.0.9tagged installer fixture smoke 均通过。
Release assets
hermes-feishu-card-v4.0.9-macos.tar.gzhermes-feishu-card-v4.0.9-linux.tar.gzhermes-feishu-card-v4.0.9-windows.ziphermes-feishu-card-v4.0.9-checksums.txt