前言¶
DeepSeek Harness(DSH)的会话并不只是浏览器里可见的几段文字。持久化事件日志、附件对象存储、工作区注册信息都在运行 Host 的本机上。换电脑、换环境时,如果只拷贝聊天记录文本,上下文、附件和 workspace 往往对不上,很难「接着聊」。
社区插件 dsh-session-takeout(维护者 northstacker,GitHub:northstacker/dsh-session-takeout)把一段完整会话打成单个 ZIP,在另一台机器上导入后恢复会话并继续对话。下面介绍它的定位、包内结构、安装方式与使用注意点。
这是什么¶
dsh-session-takeout 是 DSH 生态里的 bundle 插件(当前 package.json 版本 1.0.0,许可证 MIT)。一句话:把当前 DeepSeek Harness 会话打包成一个 ZIP,带到另一台电脑导入后继续聊。
插件在 Web UI 消息框下方增加两个小按钮:导出会话 / Export session、导入会话包 / Import bundle。导出时 ZIP 写入 ~/Downloads,并在 Finder 中Reveal;导入则在本机解析 ZIP、恢复会话并打开对话。
为什么由 Host 干活¶
Client 侧只触发 Host 上的三条路由, durable 数据都在 Host 侧读写:
| 路由 | 作用 |
|---|---|
POST /session-takeout/export |
传入 { sessionId },写出并 reveal ZIP,返回路径 |
POST /session-takeout/import |
传入原始 ZIP 字节,恢复会话,返回新 session id |
POST /session-takeout/reveal |
传入 { path },在 Finder 中 reveal 路径 |
会话的完整事件流、附件存储与工作区注册不在浏览器里单独维护,因此导出/导入逻辑放在 Host 是合理分工。
会话包里有什么¶
ZIP 为普通 deflate、UTF-8 文件名、无 ZIP64,可用 Finder、资源管理器或 unzip 打开;即使未装插件,包内会话文本仍可阅读。目录结构如下:
manifest.json format 标签、会话摘要、计数、校验和
session/header.json SessionHeader + inheritedEventCount
session/events.jsonl 完整事件日志,每行一个 JSON 对象
attachments/<id> 对话引用的图片/文件原始字节
plugin/<file> 本插件源码,便于在目标机安装插件
README.md 给人看的简要说明
manifest.json 里的 format 固定为 dsh-session-bundle,与项目名分开版本,便于项目改名后旧包仍可导入。
导出与导入的行为¶
导出会先通过 sessions 服务 flush 当前 live session,避免仍在写入的会话事件不全;再读 durable 日志,只复制事件实际引用的附件。
导入在解析完成且每条目 CRC 校验通过之前,不会写入本机存储。之后依次:把附件恢复到内容寻址对象存储(已存在对象保留)、按本机 session 格式版本写日志、为恢复会话指向新的 cwd 目录、若源 session id 已存在则 mint 新 id、注册 workspace 并绑定会话。恢复后的对话落在:
~/Documents/DeepSeek Harness/<title>-<shortid>/
该目录即其 workspace;导出机上的绝对路径不会被复用。
安装与启用¶
官方 README 给出的安装方式为 bundle 安装,不是 dsh plugin add github:... 这类拼接命令:
plugin_manager → install_bundle → target: <this directory>
bundle patch 只插入一行配置,无需改 profile 其它项。重启 Web UI(或等待 client 插件热加载)后,消息框下方会出现导出/导入两个按钮。
插件以当前 DSH 进程权限运行;安装前建议浏览 仓库源码 并确认 MIT 许可证与实现是否符合你的环境要求。
典型用法¶
本机导出、本机或他机导入(已装插件)
- 在当前会话点击 导出会话 / Export session,在
~/Downloads得到 ZIP。 - 将 ZIP 拷到目标机器,点击 导入会话包 / Import bundle 选择该 ZIP;恢复后会话可直接继续。
目标机从未装过本插件
每个导出的 ZIP 在 plugin/ 下自带插件源码,仅持归档即可:
- 拷贝 ZIP 并解压。
- 将
plugin/作为 bundle 安装:plugin_manager → install_bundle → <解压目录>/plugin。也可让 agent 不经对话框直接 POST ZIP:
curl -X POST http://127.0.0.1:<port>/session-takeout/import --data-binary @bundle.zip
- 点击 导入会话包 / Import bundle 选择 ZIP(或由上述 curl 完成同等导入),恢复后的对话即可继续。
仓库内可用以下命令跑 bundle 相关测试(48 项检查,假服务与临时 HOME):
node test/bundle.test.mjs
适用场景与限制¶
适合:需要在两台电脑间迁移同一段 DSH 对话(含事件日志与附件)、或备份可再次导入的会话归档;目标环境可安装 bundle 或仅持 ZIP 后按 README 装 plugin/。
需要知道的限制(均来自官方 README):
- 导出机上附件对象文件缺失时,会在
manifest.json的missingAttachments中列出,不会进入包内。 - 从其它会话 fork 出来的 session 会保留
inheritedEventCount;父会话前缀不在 bundle 里,只有本 log 中的部分会被带走。 agentPreset以 id 形式携带;目标机未安装对应 preset 时,会话以默认 agent 打开。
DSH 社区插件目录在 SkillHub 插件页,与 DeepSeek / 幻方无官方从属关系,属于社区「一切皆插件」生态中的独立条目。
结尾¶
dsh-session-takeout 把 Host 侧的会话日志、附件与工作区注册打成可携带的 ZIP,并在导入时校验、重建 workspace,避免简单拷贝聊天文本带来的上下文断裂。需要细节与更新时,以 GitHub 仓库为准:
- 目录页:https://www.skillhub.cn/plugins/northstacker/dsh-session-takeout
- 仓库:https://github.com/northstacker/dsh-session-takeout