dsh-session-takeout:把 DSH 会话打包成 ZIP,换机接着聊

前言

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 许可证与实现是否符合你的环境要求。

典型用法

本机导出、本机或他机导入(已装插件)

  1. 在当前会话点击 导出会话 / Export session,在 ~/Downloads 得到 ZIP。
  2. 将 ZIP 拷到目标机器,点击 导入会话包 / Import bundle 选择该 ZIP;恢复后会话可直接继续。

目标机从未装过本插件

每个导出的 ZIP 在 plugin/ 下自带插件源码,仅持归档即可:

  1. 拷贝 ZIP 并解压。
  2. 将 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
  1. 点击 导入会话包 / 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye