dsh web 和终端会话互通吗?DeepSeek Harness 网页开会话、终端接力与双开风险
dsh web 和终端用的是同一份会话数据——网页里开的会话,终端能找到;但同一会话不能两边同时开。 判断依据只有一条:它们都指向同一个 $DSH_HOME。本文讲清会话在哪、怎么接力、以及双开为什么会损坏会话。
概览:dsh web 与终端是同一份数据
网页与终端不是两套数据,而是同一份 $DSH_HOME 的两个前端。 会话日志以 JSONL 文件落在 profile 的 sessions 目录里,所以「换个入口继续」这件事本身成立(来源)。真正需要小心的是并发写入:两个实例同时打开同一会话会写出序列缺口,直接损坏会话。
DeepSeek Harness 网页与终端共用同一份会话:$DSH_HOME 是唯一事实源
会话、配置与 DSH插件都放在 $DSH_HOME(默认 ~/.dsh),与启动方式无关,所以 npx 启动的 web、全局安装的 web、终端里的应用看到的是同一批数据。 切换入口不会丢会话,这也是为什么同一个环境里换命令启动后,历史会话还在(来源)。
两个关键归属规则:
- 会话归属 profile:每个 profile 有独立的目录与依赖,会话数据跟着 profile 走;
- 会话按工作目录分组:项目目录名由会话创建时的工作目录转写而来,形如
--项目路径--;没有工作目录的会话落在_no-cwd/下。
先定位:你的会话文件在哪个目录
定位会话的唯一入口是 profile 的 sessions 目录——先找到它,后面所有操作才有落点。 会话日志以 JSONL 追加文件存储在 profile 数据目录下的会话存储路径,由 session-persistence-jsonl 定义(来源)。
- 列出该 profile 的会话目录:
ls -la ~/.dsh/profiles/<profile>/sessions
预期:看到按项目分组的目录(形如 --项目路径--)与其中的会话文件;
2. 确认文件格式,预期:默认是 session.jsonl.zstd(zstd 压缩、带校验);把压缩配置配成 none 时是 session.jsonl;
3. 需要核对内容时先解压再查看,预期:能读到逐条追加的会话事件;不要用编辑器直接改这个文件。
用终端接力 dsh web 里的会话
终端侧应用自带 --resume 参数,把它指向会话 id 就能继续;注意 --resume 属于被启动的应用,不是 dsh 启动器。 官方 CLI README 明确划分了启动器与应用的参数边界(来源)。
- 在 Web UI 里找到目标会话,记下它的会话 id;
- 用对应 profile 的终端应用接力:
dsh --profile tui --resume <会话 id> # 前提是已装 tui profile
预期:终端里加载出该会话的历史,可以继续往下对话;
3. 若提示 profile 不存在,说明该终端 profile 尚未创建,预期:先在 Web UI 里把需要的会话内容导出或截图,再决定是否创建对应 profile;
4. 参数写法以你本机 dsh --profile <name> --help 的输出为准,预期:能看到该应用自己声明的 resume 类参数。
别双开同一个 DeepSeek Harness 会话:seq gap 是这么来的
同一会话同时被两个实例打开时,并发追加会写出重叠的序列号,加载时报 seq gap in committed region。 根因是两个进程各用自己内存里的游标追加,JSONL 后端没有跨进程协调(来源)。
- 触发条件有两条,叠加后几乎必现:同一个
$DSH_HOME同时被两个实例打开,且期间有中断的工具调用; - 报错现象,预期:会话打不开,日志报序列缺口;
- 规避做法,预期:同一时间只保留一个入口操作同一会话;需要换端时先把当前端停掉(确认没有进程监听 3080),再到另一端打开;
- 已经损坏时先备份会话文件再从日志尾部处理,具体步骤见《DeepSeek Harness 会话日志报 seq gap 打不开》。
dsh 归档不等于删除:界面能做的与文件系统能做的
界面里的「归档」只是不显示,真删只能走文件系统。 被归档的会话从 workspace 分组、Ungrouped、内容搜索与平铺列表中消失,但日志文件与 workspace 记账席位都没被改动,而且当前版本界面没有查看或取消归档的入口(来源)。
- 只想让它不出现在列表里 → 用归档,预期:列表变干净,数据仍在;
- 想真正删除 → 先停掉 dsh:
lsof -i :3080
预期:确认没有进程在监听,再进下一步;
3. 备份后删除目标会话目录,预期:rm -rf "$DSH_HOME/sessions/--<项目>--" 删某个项目;这是不可恢复操作、没有回收站,删前先 cp -r "$DSH_HOME/sessions" "$DSH_HOME/sessions.bak";
4. 重启 dsh,预期:列表里不再出现这些会话。
dsh 会话越攒越多会拖慢宿主
会话日志只增不减会拖慢会话搜索与启动,建议按项目定期清理(来源)。 判断与清理顺序:
- 看体量:
du -sh ~/.dsh/profiles/<profile>/sessions,预期:得到占用大小; - 找出大项目目录,预期:定位到已完成项目的会话目录;
- 备份 + 清理,预期:搜索与启动恢复轻快,且需要时还能从备份找回。
来源:DeepSeek Harness 官方文档 - Quickstart、dsh CLI README、session-persistence-jsonl
常见问题
能——DeepSeek Harness 的网页和终端读的是同一份数据:两者都指向同一个 $DSH_HOME(默认 ~/.dsh),会话日志以 JSONL 落在 profile 的 sessions 目录里。终端侧应用自带 --resume 参数(如 dsh --profile tui --resume 会话 id),web 与终端之间切换不会丢会话内容。
DeepSeek Harness 的会话日志以 JSONL 追加文件存储在 profile 数据目录下的会话存储路径,由 session-persistence-jsonl 定义。定位命令是 ls -la ~/.dsh/profiles/<profile>/sessions:默认日志文件是 session.jsonl.zstd(zstd 压缩带校验),把压缩配成 none 时是 session.jsonl,没有工作目录的会话落在 _no-cwd/ 下。
不建议——DeepSeek Harness 的会话被两个实例同时打开就会损坏:两个进程同时打开同一个 DSH_HOME 并并发写会话日志时,各自用内存里的游标追加、JSONL 后端没有跨进程协调,写出的 seq 会重叠,加载时报 seq gap in committed region,会话就损坏了。触发条件是「同一 DSH_HOME 被两个实例同时打开」加上「期间有中断的工具调用」,两者叠加几乎必现。
dsh 界面里能做的只有归档:被归档的会话从分组与搜索结果中消失,但会话日志文件和 workspace 记账席位都没被改动,而且当前版本界面没有查看或取消归档的入口。要真删只能走文件系统:先停掉正在运行的 dsh,再删除对应项目目录下的会话文件,删完重启生效。
会——DeepSeek Harness 的会话日志只增不减,超大会话会拖慢会话搜索与启动。建议定期清理已结束项目的会话目录,清理前先整目录备份,别顺手把整个 $DSH_HOME 删掉——配置与插件都在那里。
相关术语
- 会话日志(JSONL)
- 会话日志是 DeepSeek Harness 记录对话与工具调用的追加式文件,以 JSONL 格式存储在 profile 数据目录下的 sessions 路径中,由 session-persistence-jsonl 包定义;默认落盘为 session.jsonl.zstd。— DeepSeek Harness 官方仓库
- --resume
- --resume 是终端侧应用用来继续某个历史会话的参数,属于被启动的应用而不是 dsh 启动器;写法如 dsh --profile tui --resume <会话 id>,前提是对应 profile 已安装。— dsh CLI README
- $DSH_HOME
- $DSH_HOME 是 DeepSeek Harness 的用户数据目录(默认 ~/.dsh),profile、配置与会话数据都在其中;Web UI 与终端应用共用这一份目录,所以两端看到的会话是同一批。— dsh CLI README
- seq gap
- seq gap 是会话日志加载时的完整性报错,指日志序列号出现缺口、committed 区域无法拼接;常见成因是两个进程同时写同一个会话日志导致游标重叠。— DeepSeek Harness 官方仓库
来源
- DeepSeek Harness 官方文档 - Quickstart· deepseek-harness
- dsh CLI README· deepseek-ai
- deepseek-ai/deepseek-harness - session-persistence-jsonl· deepseek-ai