dsh-fork-map:把对话某一时刻存成可反复使用的 Fork 库

前言

在 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 归纳的三步即可上手:

  1. 存:在目标轮次(已结束)的回复栏点「存为 Fork」。
  2. 看:打开顶部「Fork 库」标签,在当前工作区或「全部」中查看卡片与 Fork 图,必要时「改名」「改备注」或「AI 起名」。
  3. 用:在目标 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」验证是否符合你的工作流。

羽毛球分组比赛记分
小程序二维码

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

小夜