fix(sessions): delete on-disk transcript files during prune and delete (#3015)

`delete_session()` and `prune_sessions()` only removed SQLite records,
leaving .json/.jsonl transcript files on disk forever. Over time this
causes unbounded disk growth (~27MB/day observed).

Changes:
- Add `_remove_session_files()` static helper that cleans up
  `{session_id}.json`, `.jsonl`, and `request_dump_{session_id}_*.json`
- `delete_session()` accepts optional `sessions_dir` param and removes
  files for the deleted session and its children
- `prune_sessions()` accepts optional `sessions_dir` param and removes
  files for all pruned sessions after the DB transaction
- Wire up CLI `hermes sessions delete` and `hermes sessions prune` to
  pass `sessions_dir`
- File cleanup is best-effort (OSError silenced) so DB operations are
  never blocked by filesystem issues
- Fully backward-compatible: `sessions_dir=None` (default) preserves
  existing behavior
This commit is contained in:
Yang Zhi 2026-04-09 21:05:23 +08:00 committed by Teknium
parent 0ba6471dd1
commit 3b60abb6bb
4 changed files with 74 additions and 9 deletions

View file

@ -9230,7 +9230,8 @@ Examples:
):
print("Cancelled.")
return
if db.delete_session(resolved_session_id):
sessions_dir = get_hermes_home() / "sessions"
if db.delete_session(resolved_session_id, sessions_dir=sessions_dir):
print(f"Deleted session '{resolved_session_id}'.")
else:
print(f"Session '{args.session_id}' not found.")
@ -9244,7 +9245,9 @@ Examples:
):
print("Cancelled.")
return
count = db.prune_sessions(older_than_days=days, source=args.source)
sessions_dir = get_hermes_home() / "sessions"
count = db.prune_sessions(older_than_days=days, source=args.source,
sessions_dir=sessions_dir)
print(f"Pruned {count} session(s).")
elif action == "rename":