前言¶
在 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)¶
list:列出可交接的旧会话候选(可配合keywords给标题命中加分);配置项maxCandidates默认最多返回 20 个(见cordis.patch.yml)。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