删你三个月前的会话之前,Hermes 现在会先问一句

某天你想翻三个月前的一次调试记录,/resume 里怎么都找不到那个会话。翻遍配置才想起来:sessions.auto_prune 是开着的,90 天前的历史在某个启动瞬间被静静删掉了,没有提示、没有确认。这件事现在改了——自动清理重新变成“要你点头才做”,而且只在你磁盘真的快满的时候才来打扰你。
变了什么:默认不删了
改动很干脆:sessions.auto_prune 的默认值从 true 改回 false。三种安装状态的行为差别如下:
| 你的情况 | 之前 | 现在 |
|---|---|---|
从没设过 sessions.auto_prune |
90 天后静默清理 | 不清理;磁盘吃紧时问一次 |
显式设了 auto_prune: true |
清理 | 照旧清理 |
显式设了 auto_prune: false |
不清理 | 不清理,也不会再问 |
注意第二行:之前主动打开过的人不受影响,你的选择被尊重。真正变化的是“从来没表过态”的那一大群人——他们的历史不再被默认当成可回收资源。
什么时候它会开口
判断逻辑写在新增的 hermes_cli/prune_advisor.py 里,热路径只做三件很便宜的事:os.stat、shutil.disk_usage,再读一小段 YAML。只有同时满足这些条件才会弹问题:
- 磁盘确实低:剩余少于 2 GiB,或者剩余比例低于 10% 且总量剩余不到 20 GiB(一块 4 TB 的盘剩 10% 不算紧张,这个条件就是为它写的);
- 你的
config.yaml里没有sessions.auto_prune这个键; - 没有生效中的“稍后再说”。
一旦触发,它才去开数据库做只读估算:按 retention_days 之外的已结束会话,结合它们占消息总量的比例,估个能释放多少。估算结果会直接写进问题里,包括最尴尬的情况——“清理救不了这块盘”:没有足够老的会话,或者能回收的空间不足以让磁盘离开低水位。
同一个问题,四个界面
- 经典 CLI:启动时问一句,只有 y / n / 回车(稍后),只在 TTY 下出现,位置就在沙箱镜像提示旁边。
- TUI 与桌面端:发一条 sticky 通知(键名
sessions.auto_prune),每个 profile 每个进程只发一次;数据库估算是另开线程跑的,不会卡住界面。 - 消息网关:把问题发到被服务 profile 的 home channel。这里有个容易踩的细节——“稍后再说”只在真的投递成功之后才记录,所以一个没有 home channel 的网关不会把问题悄悄吞掉,让 CLI 那边永远等不到。
- 斜杠命令:
/autoprune on | off | later | status,四个界面文本完全一致(走同一套注册执行器)。Slack 的 50 个斜杠命令名额满了,所以那边走/hermes autoprune。
三个回答各自意味着什么
on:写下sessions.auto_prune: true,从此按retention_days(默认 90 天)清理已结束且不活跃的会话。打开着的、钉住的、正在 turn 里的会话永远不动。off:写下false,历史留着,而且这个问题再也不会出现。- 稍后(
later):静默 7 天,之后再问。
想先看一眼自己的现状:
hermes config get sessions.auto_prune
/autoprune status
磁盘还是紧?手动分层清理
自动清理只是其中一层。真的需要腾空间时,按“破坏性从小到大”来:
hermes sessions optimize # 合并 FTS5 段 + VACUUM,不改数据
hermes sessions optimize-storage # 把搜索索引迁到更紧凑的布局
hermes sessions archive # 批量软隐藏,不删除
hermes sessions prune # 真正删除(可按时间窗、来源、标题过滤)
optimize 和 optimize-storage 只是重建索引、回收碎片,不动历史记录——这两条最值得先跑。archive 是软隐藏,删不掉数据但能让列表清爽。prune 才是真删,跑之前先想清楚有没有 session_search 需要的历史。
一点取舍建议
这条改动其实在问一个很实际的问题:历史值多少钱,磁盘值多少钱。
- 磁盘长期紧张(小 VPS、容器里只有几十 GB)、又很少回看历史:
/autoprune on更省心。 - 常用
session_search翻旧账、或者要留审计痕迹:保持默认(不删,也不问),偶尔手动optimize。 - 拿不准:什么都不写。默认状态就是最保守的那一种。
如果哪天 state.db 已经出问题了——比如提示有别的进程占着旧 WAL——那不是清理能解决的,先看会话库损坏的修复流程;想弄清会话边界的机制,可以读会话边界指南;命令细节在hermes sessions 参考。
需要说明的是,这次改动在 2026-10-16 合入 main,晚于 v0.22.2 的发布(10-15),所以它还没进任何已发布版本,等你下次 hermes update 拉到的版本才会带上。