dsh-TUI 的会话历史在关闭后能否自动恢复,取决于程序设置和文件保存方式。多数情况下需要手动把历史文件导出或复制出来,才能可靠保留上下文。处理路径先定位历史文件,再导出备份,随后按需导入,最后用定时任务兜底。整个过程不依赖服务端,全部在本地文件层面操作。
适用场景:本地使用 dsh-TUI 且需要跨会话保留上下文的场景。操作动作:定位历史文件,手动导出为 JSONL,并设置 cron 定时复制到备份目录。验证方式:在新环境导入备份文件后,检查会话列表和上下文内容是否完整。风险边界:程序版本升级可能导致历史文件格式变化,恢复前需要核对格式,必要时保留旧版程序用于转换。
定位dsh-TUI的会话历史存储文件
先看程序自身配置。通常在 dsh-TUI 的配置文件中可以指定历史记录路径,例如 ~/.config/dsh/config.toml 内的 history_path 字段。若没有设置,常见默认路径是用户目录下的 .dsh 目录,文件名为 history.jsonl。不确定位置时,用 find 搜索整个用户目录:
find ~ -name "*history*" -type f 2>/dev/null找到文件后,先完整复制一份原文件作为初始备份,之后再开始操作。因为后续导入动作可能覆盖当前历史。
主动导出当前会话到指定文件
如果 dsh-TUI 提供 export 子命令,直接用它导出当前会话上下文:
dsh-tui export `--format` jsonl -o ~/backups/dsh-$(date +%F).jsonl若没有导出命令,直接复制历史文件:
cp ~/.dsh/history.jsonl ~/backups/dsh-$(date +%F).jsonl导出的 JSONL 每行是一个对话记录,字段通常包含时间戳、角色、内容,形如:
{"ts":"2026-06-01T10:00:00Z","role":"user","content":"问题内容"}注意这只是一个示例结构,实际字段名以程序输出为准。导出后应打开文件确认至少包含刚才对话的若干条目。
从备份文件恢复会话历史
恢复前先确认当前没有运行 dsh-TUI,避免文件占用。使用 import 子命令导入备份:
dsh-tui import ~/backups/dsh-2026-06-01.jsonl如果程序没有 import 命令,直接将备份文件覆盖回默认路径:
cp ~/backups/dsh-2026-06-01.jsonl ~/.dsh/history.jsonl重新启动 dsh-TUI,查看会话列表中是否出现备份文件对应的会话。更直接的验证方式是向程序询问之前某段对话中的问题,看能否引用当时的上下文。
设置定时任务自动备份历史
手动备份容易忘,设置 cron 定时复制历史文件到备份目录。每天凌晨两点执行的示例:
0 2 * * * mkdir -p ~/backups/dsh && cp ~/.dsh/history.jsonl ~/backups/dsh/history-$(date +\%F).jsonlcron 中百分号必须转义为 \%,否则不会执行。Windows 可使用任务计划程序,触发器设为每天,操作执行 PowerShell 命令:
Copy-Item "$env:USERPROFILE\.dsh\history.jsonl" "$env:USERPROFILE\backups\dsh\history-$(Get-Date -Format yyyyMMdd).jsonl"建议备份目录单独放在另一个磁盘或网盘,避免同一位置故障时备份也丢失。
处理不同版本间的历史兼容性
升级 dsh-TUI 后,历史文件格式可能改变。先运行 dsh-tui `--version` 确定当前版本,再用 head 查看历史文件的前几行,判断是 JSONL、SQLite 还是其他格式。若导入报错或看不到历史,说明格式不兼容。此时不要直接降级覆盖,应先写一个转换脚本,把旧文件逐行解析并映射到新格式。例如把原 JSONL 中的 ts、role、content 改写为新字段:
import json
for line in open("old.jsonl"):
item = json.loads(line)
new_item = {
"time": item["ts"],
"speaker": "user" if item["role"] == "user" else "assistant",
"text": item["content"]
}
print(json.dumps(new_item))转换脚本先在临时目录生成新文件,再导入新版本程序验证上下文。确认能恢复后,再替换正式历史文件。保留旧版本安装包,以便需要时反向转换。