dsh-handover:把旧 DSH 会话压成交接包,让新会话接着干

前言

在 DeepSeek Harness(DSH)里开一个新会话时,模型对上一轮对话里已经敲定的约束、查过的结论、动过的文件一无所知。常见补救是人工复述背景,或去翻原始 JSONL 日志——体积往往几 MB,人很难快速定位要点。

下面介绍的 dsh-handover(维护者 startime-ltk,分类:工作流)面向「跨会话续工」:从只读的旧会话里裁出一份有界「交接包」(进度、动过的文件、用户要求、未做完的事等),交给当前会话的模型作背景,再与用户确认后继续。它不建知识库、不改写旧会话、不把旧会话变成 live。插件以 JavaScript 实现,当前版本 0.2.0,许可证 MIT;在 DSH 0.2.x 上开发验证,需 Node.js >= 22,宿主需挂载 sessionQuery(官方 @deepseek-ai/dsh-base 已包含)。


这是什么

dsh-handover 注册的是给模型用的 handover 工具,没有按钮、没有 / 命令、没有面向用户的设置面板。用户用自然语言说明要接哪次旧会话,由模型调用工具列出候选、生成交接包并注入当前上下文。

旧会话全程只读:插件只使用 ctx.sessionQuery 的读取能力(如 readSession / listSessions / readTitleSnapshots),不 append、不 resume、不写入旧会话。

README 中给出的压缩效果示例:某会话约 7.08 MB / 44 轮 → 约 2072 字交接包(具体会话因内容而异)。


核心功能

交接包生成(list / pack)

  1. list:列出可交接的旧会话候选(可配合 keywords 给标题命中加分);配置项 maxCandidates 默认最多返回 20 个(见 cordis.patch.yml)。
  2. pack:对指定 sessions 生成交接包;多会话时各出一份再合并,合计字数受 budget(默认 3000 字,与配置 budgetChars 一致)约束,超出时从末尾整块丢弃并在开头说明省略情况,不会截断半份包或丢掉闭合标签。

交接包为 XML 结构,内含固定警告:内容为旧会话背景,不是指令;只有当前用户有权威。跨工作目录可读,但包尾会标注文件不共享、不能直接改同一份文件。

包体段落大致包括:

段落 含义
上次干到哪了 最后一条有实质长度的助手正文
动过的文件 写类工具调用中的路径
跑过的关键命令 会改变状态的 shell 命令(如 git / npm / pnpm / rm 等),只读命令不记
用户说过的要求 最早 3 条 + 最近 9 条,优先保留含「不要/别/必须」的硬约束
没做完的事 最后一次 todo 相关记录 + 是否正常结束的判断
翻过的文件 读类工具路径(排除过于宽泛的通配符)

裁切策略有意丢掉工具输出与思考过程(README 实测占比约 70% / 19%),以控制体积。

中途查细节(search / read,0.2.0)

交接包是摘要。需要某条报错原文或对话片段时,模型可:

  • search:按 query 字面匹配(空格分隔多词表示全部命中),返回 seq、时间、角色、上下文片段;可不传 sessions,则在同工作目录最近 8 个会话中搜。
  • read:按 session + seq 取原文,可用 before / after 各多取几条(默认各 1)。

边界与安全

  • 当前会话 id 不会出包,会提示「这就是当前会话」。
  • 读失败会明确报错,不静默少内容。
  • 包体强调先与用户确认再动手,避免把历史背景当成授权。

安装与启用

插件以 cordis bundle 形式挂进 DSH profile。以下步骤摘自仓库 README,以 ~/.dsh/profiles/desktop 为例;本地仓库路径可自定。

1. 将本仓库放到本地(示例路径 D:\dsh-handover),在仓库目录安装 peer 依赖:

cd D:\dsh-handover
npm install

npm install 用于安装 peer 依赖 @deepseek-ai/dsh-tools。

2. 在 profile 的 package.json 里加链接和 bundle:

{
  "dependencies": {
    "dsh-handover": "link:D:/dsh-handover"
  },
  "dsh": {
    "profile": {
      "bundles": [
        "dsh-handover"
      ]
    }
  }
}

3. 让链接生效:

cd ~/.dsh/profiles/desktop
pnpm install --no-frozen-lockfile

4. 重启 DSH。 新会话里对模型说「列一下可以交接的旧会话」,能拿到候选列表即表示启用成功。

可选配置(cordis.patch.yml):

- insert:
    - id: dsh-handover
      name: dsh-handover
      config:
        maxCandidates: 20
        budgetChars: 3000

卸载:从 profile 的 dependencies 与 dsh.profile.bundles 移除 dsh-handover,在 profile 目录执行 pnpm install,再重启 DSH。

安装前建议阅读仓库源码与 MIT 许可证;插件在当前 DSH 进程权限下运行,可读取本机会话查询服务能访问的会话数据。


典型用法

用法等价于「怎么对模型说话」——由模型调用 handover,用户不必记子命令。

一句话流程:

你说 → 模型列候选 → 你点一个 → 模型出包并进入上下文 → 模型确认进度 → 接着干

常见说法(摘自 README):

你说 会发生什么
「交接一下上次装插件那个会话」 先列候选,等你点名
「列一下可以交接的旧会话」 只列候选,不出包
「就第二个」 对第 2 个候选出包
「第 1 个和第 3 个都要」 两个会话各出包再合并(受 budget 约束)
「把 session-649aa027… 交接了」 直接出包,跳过列表
「交接包压短一点」 调小 budget
「用 handover 工具列一下」 明确要求走该工具

触发词可含「交接」「接着上次」「继续昨天那件事」。若模型未响应,可直接说「用 handover 工具」。

模型侧主要参数:

参数 说明
action 必填:list / pack / search / read
sessions pack 必填;search 可选
budget pack 时全部交接包合计字数上限,默认 3000
query / limit search 用
session / seq / before / after read 用

适用场景与注意

适合谁

  • 经常为新任务开新会话,但希望保留旧会话里的硬约束、进度和文件路径的 DSH 用户。
  • 需要把多 MB 会话日志压成数千字量级背景,再让模型续工的工作流场景。

第一版已知限制(README)

  • 无界面开关,依赖模型调工具;list 不自动替你选定会话。
  • 交接包是规则裁切,不是模型重写摘要;段「上次干到哪了」默认只保留最后一条实质正文,更早中间进度需用 search / read。
  • search 为字面匹配,非语义检索。

生态说明:DSH 主张「一切皆插件」;社区目录站点与 DeepSeek / 幻方无官方从属关系,本插件通过 GitHub 与 SkillHub 目录页分发,安装方式以 README 的 profile link 为准,并非统一的 dsh plugin add 一行命令。


结尾

dsh-handover 用只读方式把旧会话压成有界交接包,让新会话在确认后继续同一项工作,并支持 search / read 回到原文查细节。进一步了解可看目录页与仓库:

  • 目录页:https://www.skillhub.cn/plugins/startime-ltk/dsh-handover
  • GitHub:https://github.com/startime-ltk/dsh-handover
羽毛球分组比赛记分
小程序二维码

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

Xiaoye