Skip to content

[Bug] create_session 静默失败 + 消息重复写入 — 会话从 state.db 消失 #12563

@lwj-9650

Description

@lwj-9650

Bug 描述

两个相关 Bug 导致会话从 `state.db` 消失,但 JSON 文件正常保存。

### Bug 1:create_session() 静默失败 → session 从未进入数据库

**位置:** `run_agent.py` 第 ~1253 行

当 `create_session()` 遇到 SQLite 锁竞争错误时,会捕获异常、打印 warning,然后直接 return。Session 的 JSON 文件正常创建,但 **sessions 表里没有对应的行**。之后 `append_message` 因为 session row 不存在,跳过写入。

**代码路径:**
```python
try:
    session_id = await state.create_session(...)
except Exception as e:
    logger.warning(f"Failed to create session: {e}")  # ← 静默失败,没有补救
    return  # session_id 未设置,后续 append_message 跳过
```

**影响:** Session JSON 文件堆积在 `~/.hermes/sessions/`,但 `session_search` 查不到(它查的是 DB)。

### Bug 2:_flush_messages_to_session_db 重复写入所有消息

**位置:** `run_agent.py` ~第 2590 行,`_flush_messages_to_session_db`

每次刷新消息时,**所有消息都被重新写入一遍**,而不是只写入新增的消息。`_last_flushed_db_idx` 游标没有正确追踪已写入的消息。导致在 DB 中的 session,message_count 是实际 JSON 消息数的 **2 倍**。

## 复现步骤

1. 同时运行多个 Hermes 实例(cron + CLI 并发)
2. 观察 `state.db` 的 session 数量少于 `~/.hermes/sessions/*.json` 文件数量
3. 对于存活在 DB 中的 session,message_count 是 JSON 实际数量的 2 倍

## 环境

- Hermes(NousResearch/hermes-agent)
- 系统:WSL2(Ubuntu 22.04)
- 数据库:SQLite state.db

## 预期 vs 实际

| 项目 | 预期 | 实际 |
|------|------|------|
| Session 在 DB 中 | JSON 创建后就有 | create_session 失败时消失 |
| 消息数量 | 准确递增 | 受影响 session 是 2 倍 |
| session_search | 返回所有 session | 只返回成功写入 DB 的 |

## 建议修复

**Bug 1:** 添加重试逻辑 + 错误升级。至少把 `logger.warning` 改成 `logger.error` 让错误可见。

**Bug 2:** 确保 `_last_flushed_db_idx` 在写入成功后更新,而不是写入前。可通过对比写入前后的 message_count 验证。

## 相关 Issue

- Issue #12029:session 泄漏 / end_session 未调用(同类根因)
- Issue #11511:FTS5 中文搜索失败(已修复)

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High — major feature broken, no workaroundcomp/agentCore agent loop, run_agent.py, prompt buildertype/bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions