fix(hermes): add SQLite fallback for loadHermesSession #536

Merged
xiaomo merged 1 commits from fix/535-sqlite-fallback into main 2026-05-26 14:24:42 +00:00
Owner

What

loadHermesSession now falls back to SQLite when JSON snapshots are disabled.

Why

Hermes defaults to write_json_snapshots: false, causing loadHermesSession to fail silently.

Changes

  • Added getHermesDbPath() and loadHermesSessionFromDb()
  • Modified loadHermesSession() with DB fallback
  • 9 new test cases

Ref

Fixes #535

## What `loadHermesSession` now falls back to SQLite when JSON snapshots are disabled. ## Why Hermes defaults to `write_json_snapshots: false`, causing `loadHermesSession` to fail silently. ## Changes - Added `getHermesDbPath()` and `loadHermesSessionFromDb()` - Modified `loadHermesSession()` with DB fallback - 9 new test cases ## Ref Fixes #535
xiaoju added 1 commit 2026-05-26 14:20:10 +00:00
When sessions.write_json_snapshots is disabled, Hermes only writes to
state.db (SQLite). loadHermesSession now falls back to reading from
~/.hermes/state.db when the JSON file is missing.

- Add getHermesDbPath() and loadHermesSessionFromDb() functions
- Use bun:sqlite with readonly mode, try-catch for graceful errors
- JSON file still takes priority (fast path)
- Filter messages to user/assistant/tool roles
- Convert unix timestamps to ISO 8601 strings
xiaomo approved these changes 2026-05-26 14:24:36 +00:00
xiaomo left a comment
Owner

LGTM 👍 SQLite fallback 逻辑清晰,测试覆盖充分(9 个用例)。

Minor nits(不阻塞合并):

  1. loadHermesSessionFromDb 的 db.close() — 两层 try-catch 里有两处 db.close(),建议用 try/finally 保证关闭,更防御性。现在如果 db.query().all() 抛了,内层 catch 会兜住并关闭,所以不是 bug,只是可读性。

  2. 函数签名loadHermesSessionFromDb 标了返回 Promise 但内部全是同步操作,用 Promise.resolve() 包装。可以改为同步函数直接返回 HermesSessionJson | null,让 loadHermesSession 那边 await 自然兼容。不改也没问题。

  3. "JSON takes priority" 测试 — 这个测试实际上只是读了 JSON 文件验证内容,没有真正调用 loadHermesSession 来验证 fallback 优先级逻辑。算是文档性测试,不是功能验证。

小橘 solve-issue workflow 自修自己的 bug,双层 dogfooding 给力 🐕

LGTM 👍 SQLite fallback 逻辑清晰,测试覆盖充分(9 个用例)。 **Minor nits(不阻塞合并):** 1. **`loadHermesSessionFromDb` 的 db.close()** — 两层 try-catch 里有两处 `db.close()`,建议用 `try/finally` 保证关闭,更防御性。现在如果 `db.query().all()` 抛了,内层 catch 会兜住并关闭,所以不是 bug,只是可读性。 2. **函数签名** — `loadHermesSessionFromDb` 标了返回 `Promise` 但内部全是同步操作,用 `Promise.resolve()` 包装。可以改为同步函数直接返回 `HermesSessionJson | null`,让 `loadHermesSession` 那边 await 自然兼容。不改也没问题。 3. **"JSON takes priority" 测试** — 这个测试实际上只是读了 JSON 文件验证内容,没有真正调用 `loadHermesSession` 来验证 fallback 优先级逻辑。算是文档性测试,不是功能验证。 小橘 solve-issue workflow 自修自己的 bug,双层 dogfooding 给力 🐕
xiaomo merged commit 6ff1414cf0 into main 2026-05-26 14:24:42 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/workflow#536