Skip to content

fix(hermes): 持久化原生会话用于冷恢复#500

Open
DeepColds wants to merge 1 commit into
masterfrom
fix/hermes-cold-resume-cli-session
Open

fix(hermes): 持久化原生会话用于冷恢复#500
DeepColds wants to merge 1 commit into
masterfrom
fix/hermes-cold-resume-cli-session

Conversation

@DeepColds

Copy link
Copy Markdown
Collaborator

改动说明

修复 Hermes 适配器冷恢复时使用 botmux 逻辑 sessionId 作为 hermes --resume 目标,导致 Hermes 报 Session not found、上下文丢失的问题。

主要改动:

  • Hermes bridge 识别到 native sourceSessionId 后,复用现有 cli_session_id 链路持久化到 botmux session 的 cliSessionId
  • Hermes adapter resume 时优先使用持久化的 resumeSessionId / cliSessionId,缺失时才 fallback 到 botmux sessionId
  • 为 Hermes 增加 resume target 预检查:查询 Hermes state.dbsessions.id,并 fallback 查询 messages.session_id;能确认不存在时复用 worker 现有 fresh fallback,避免 crash-loop。
  • worker 传入 Hermes 实际使用的 state.db 路径,覆盖 HERMES_HOME / BOTMUX_HERMES_STATE_DB / hermes-botmux-session profile 场景。

影响面

  • 主要影响 Hermes CLI 的冷恢复路径(daemon 重启、worker 回收/关闭、机器重启后的 PTY/Tmux 冷启动)。
  • 改动触达通用 CliAdapter.checkResumeTargetExists 参数,新增可选 stateDbPath,不改变其它 CLI 既有行为。
  • Hermes bridge 绑定 native source 时会更新 session store / dashboard 可见的 cliSessionId;多个 Hermes Bot 共享 state.db 时仍依赖现有 marker 过滤逻辑隔离。
  • /clear 导致一次 drain 绑定多个 Hermes source 时,会按顺序持久化,最后一个 source 成为后续冷恢复目标,符合恢复最新 Hermes 上下文的预期。

测试验证

已通过:

pnpm vitest run --project unit test/cli-adapters.test.ts test/hermes-transcript.test.ts test/hermes-worker-bridge-wiring.test.ts test/hermes-session-filter.test.ts
# Test Files  4 passed (4)
# Tests  314 passed (314)

pnpm build
# tsc + dashboard bundle + dist audit 通过

补充执行:

pnpm test

结果:整体测试执行到 564 passed / 567 files9089 passed / 9095 tests,失败 6 个,均与本次 Hermes 改动无关,集中在 Linux 进程发现/worker fence 类测试:

  • test/session-discovery.smoke.test.ts 期望 node comm,实际为 MainThread
  • test/v3-cancel-runtime.test.ts 2 个 timeout
  • test/v3-worker-fence.test.ts 3 个进程发现结果从 one/recovered 变 ambiguous

后续验证建议

发布 canary 后请在 macOS + PTY + Hermes 0.18.2 环境验证:

  1. 首轮 Hermes 对话成功。
  2. botmux session 中写入 Hermes native cliSessionId(如 20260716_163643_7782fd)。
  3. 强制关闭 worker / 重启 daemon。
  4. 下一条消息冷启动执行 hermes --resume <Hermes native id>,上下文仍可恢复。

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