Repository navigation
znaide v1.0.7
znaide v1.0.7(2026-09-18)
修一个会把会话历史切两半的问题:恢复会话之后,接着聊的内容不会写回那个会话。
一、修:恢复会话后,新消息跑到别的会话里
现象:/resume 或会话管理窗口恢复一个会话,接着聊 —— 上下文是接得上的(模型记得之前聊过什么),但落盘跑偏了:
- 被恢复的那个历史文件从此不再增长;
- 之后所有消息都写进一个新建的会话文件(文件名是启动时生成的那个 id);
- 状态栏显示的会话 id 也是这个新 id。
一段对话被悄悄切成两半,没有任何提示;再 --resume 哪一半,都只剩半截。
为什么:恢复时只换了"内存里的对话",没换"会话身份"。引擎的身份(session_id、历史文件路径、已经打开的文件句柄)是启动时定死的,而 load_history 只做了"读进来 → 重建系统提示 → 通知界面",这三样一个都没动 —— 后续每条消息自然继续写启动时那个新会话。
现在:恢复即"接着这个会话往下走" ——
- 身份一并接过来:
session_id取被恢复文件的文件名(与启动参数--resume同一规则),历史文件指向它,旧句柄作废,下次写入重新打开正确的文件; - 接上的历史文件不会再被补一条
{"meta":…}(以前每恢复一次就多一条); - 状态栏的会话 id 跟着变(以前一直显示新建的那个);
- 顺带:恢复的目标文件里没有消息时也回执一次,界面会照实清空(以前界面留着旧对话,而引擎的上下文其实已经空了)。
启动参数 --resume <片段> 本来就没这个问题(它一开机身份就是对的),坏的只有会话中途的恢复。
二、验证
- 测试 222 项全绿(core 108 / mock-e2e 19 / tui 95),编译零警告。新增用例
load_history_takes_over_session_identity盯着四条:身份切换、新消息续写回目标文件、不产生新文件、不发第二条 meta,以及SessionInfo/HistoryLoaded都送达界面。 - 真机(隔离数据目录 + 本地 mock 端点):恢复一个 2 条消息的会话 → 聊一句 → 目录里只有那一个会话文件、老内容保留、新的一问一答续写在后面、meta 只有 1 条、状态栏 id 从启动 id 变成被恢复的 id。
- 用一段真实的 148 条消息历史实跑恢复:提示"已恢复历史会话(148 条消息)",发一句后文件续写、端点收到 150 条消息、末尾正是那段对话的尾巴。
三、说明
- 已经装了 v1.0.6 的,
znaide --update会提示升级到 1.0.7(这次是正经的版本号,不是同版本原地替换)。 - 这个 bug 不影响模型上下文(恢复本身是成功的),只影响"新消息记到哪儿"。如果之前踩过,会话目录里会多出几个"半截会话",可以按 id 找出来、把后一段的内容接回原文件(手工就能做)。
- 没动依赖与配置格式,旧配置直接可用。