前言¶
在 DeepSeek Harness(DSH)Web 里,原生「分叉」点一下就会立刻新建会话,分叉点本身不会留在库里。想从同一轮上下文再试几种方案,通常要回到原会话、找到那一轮、再点一次;原会话删了以后,那个位置也无法再分叉。
实际开发里常见需求是:已经把项目背景、约束和代码结构聊清楚,想从当前状态分别尝试不同方案;或者某一轮回复质量稳定,希望当作以后反复使用的起点;又或者对话已经跑偏,想回到更早的干净节点重来,但不想长期保留乱掉的会话。
下面介绍社区插件 dsh-fork-map(维护者 Hercules-debug,分类为工作流)。它在 DSH Web 侧为每个工作区维护一份持久化的 Fork 库:把某一轮结束前的完整上下文存成快照,在界面里查看 Fork 谱系,并从任意 Fork 多次启动互不干扰的新会话。
这是什么¶
dsh-fork-map 是面向 @deepseek-ai/dsh Web 的插件(npm 包名 dsh-fork-map,当前资料中版本为 0.2.0,许可证 MIT)。一句话定位:Fork 是可反复取用的上下文资源,而不是只能用一次的分叉按钮。
与原生分叉的主要差异可以概括为:
| 维度 | 原生分叉 | Fork 库(本插件) |
|---|---|---|
| 点击之后 | 立刻变成新会话 | 存入库,当前对话不打断 |
| 可使用次数 | 一次 | 不限,每次新建独立会话 |
| 源会话删除后 | 无法再从该位置分叉 | 快照独立,仍可启动 |
| 查找方式 | 在原会话里翻轮次 | 「Fork 库」标签按工作区列出 |
| 命名与备注 | 不支持 | 可命名、写备注、手动修改 |
| 谱系 | 侧栏父子嵌套 | Fork 图:从 Fork 启动的会话再存 Fork 会挂为子节点 |
项目地址:GitHub — Hercules-debug/dsh-fork-map;社区目录页:skillhub.cn/plugins/Hercules-debug/dsh-fork-map。DSH 生态理念是「一切皆插件」;社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。
核心功能¶
存:在已结束的回复上「存为 Fork」¶
每轮助手回复下方的操作栏里,在原生分叉按钮旁增加书签图标「存为 Fork」。点击后,到该轮为止的完整上下文写入当前工作区的 Fork 库,当前会话继续,不被打断。
- 同一轮重复保存只保留一份,会提示「这一轮已在 Fork 库中」。
- 仍在生成中的轮次不能保存,需等该轮结束。
看:「Fork 库」标签与 Fork 图¶
对话区顶部在「对话 / 轨迹」旁增加「Fork 库」标签,展示当前工作区的 Fork 图(可切换「当前工作区 | 全部」并刷新)。
每张卡片展示名称、轮数、最后一问、最后一答、备注、来源会话与快照大小等;来源会话可点击跳转,已删除的会划线标出。在某个 Fork 启动出的会话里再存 Fork,新节点会挂在原 Fork 下,谱系在图中可见。
用:从 Fork 启动新会话¶
点击「从这里启动新会话」后,新会话携带截止到该轮的快照上下文打开,标题形如 <名称> · Fork N,并归入与保存时相同路径的工作区。可连续点击,每次均为新的独立会话,互不影响。
命名与备注¶
保存后卡片会先显示「正在起名…」,随后由插件发起一次独立的模型调用:把快照还原为当时完整上下文,在末尾临时加入命名请求,让模型以该段对话的身份为自己起名并写备注(进展与适合从此处继续做什么)。若该 Fork 来自「从父 Fork 启动的会话」,请求中会带上父 Fork 的名称与备注。
- 命名请求与模型回答不写入快照、不写入任何会话,不污染 Fork 内容。
- 优先使用该对话最后一次使用的模型;不可用时退回当前默认模型。
- 手动修改过的名称或备注不会被自动覆盖;「AI 起名」会重新生成并覆盖。
- 起名失败时 Fork 仍可用,名称退回源会话标题,原因记入 dsh 日志。双击名称可手动改名。
底层行为(与使用相关的部分)¶
Fork 保存的是从会话开头到切点轮的完整事件快照(zstd 压缩),不是指向源会话的引用;切点规则与原生分叉一致(从点选的回复往后找第一个 turn/end,再推进到下一个 turn/start 之前)。从 Fork 启动的新会话走 DSH 自身的 composeAgent 与 agents.create 流程,不记录父会话,因此侧栏不会嵌在可能已删的源会话下;谱系由 Fork 库自行维护。
索引与快照默认落在 DSH storage 域:
| 内容 | 位置 |
|---|---|
| Fork 索引 | ~/.dsh/storages/fork_library.json |
| 上下文快照 | ~/.dsh/storages/fork_library_snapshots/<forkId>.json.zst |
宿主侧还提供 /api/forkLibrary.* 系列接口(与 GUI 共用登录鉴权),供列表、保存、启动、更新、删除与自动起名等操作。
安装与启用¶
需要已安装 DSH Web(@deepseek-ai/dsh)且 Node.js ≥ 22。
资料中的安装步骤如下:先将仓库放到本机,再用 web profile 注册插件路径(具体路径替换为你的目录):
git clone https://github.com/Hercules-debug/dsh-fork-map.git
dsh plugin --profile web add /path/to/dsh-fork-map
装好后须 重启 dsh web,再刷新浏览器。插件宿主在进程启动时加载,仅刷新页面不够。
若不用 dsh plugin 命令,可在 ~/.dsh/profiles/web/package.json 的 dependencies 中加入 "dsh-fork-map": "link:/path/to/dsh-fork-map",在 dsh.profile.bundles 中加入 "dsh-fork-map",在 profile 目录执行 pnpm install(或手动软链 node_modules/dsh-fork-map);若 cordis.patch.yml 中存在 id: fork-map 且 disabled: true,删除对应禁用项后同样重启 dsh web。
插件以当前 dsh 进程的权限 读写 ~/.dsh/storages/ 下的数据;安装前建议自行阅读仓库源码与 MIT 许可证,确认行为符合你的环境策略。
典型用法¶
按 README 归纳的三步即可上手:
- 存:在目标轮次(已结束)的回复栏点「存为 Fork」。
- 看:打开顶部「Fork 库」标签,在当前工作区或「全部」中查看卡片与 Fork 图,必要时「改名」「改备注」或「AI 起名」。
- 用:在目标 Fork 上点「从这里启动新会话」,在新会话中继续探索;若结果值得保留,可再存子 Fork,谱系会自动挂在父节点下。
适用场景与限制¶
适合:需要在同一上下文起点上并行试多种方案;希望把某轮对话固化为可复用的 review / 讲解起点;源会话可能删除但仍要从历史节点重启;需要按工作区整理 Fork 并查看父子谱系。
已知限制(以 README 为准):
- 只能在已结束的轮次上存 Fork。
- 子代理(subagent)会话不能存 Fork。
- 新会话工作目录固定为保存时的路径;目录被删或移动后,从 Fork 启动的会话可能无法正常工作,也不会归入任何工作区。
- 修改宿主代码(
lib/index.js、lib/library.js、lib/store.js)后需重启dsh web才生效。
结尾¶
dsh-fork-map 把 DSH Web 上易被耗尽的「一次性分叉」变成按工作区持久化的 Fork 库:快照独立、可命名、可构图、可多次启动。若你已经在用 DSH Web 做长对话开发,可以先按官方安装步骤接入 web profile,再在一轮上下文稳定后用「存为 Fork」验证是否符合你的工作流。