前言¶
在 DSH 里做长任务,常见做法是换一个新会话窗口继续。若要把上下文带过去,可以 @ 引用上一个会话:在百万 token 上下文窗口下,单源上限大约可到 20 万 token 量级,代价是一次性吃进大量历史。另一种做法是让模型在收尾时写交接摘要,每次换窗都要多一次生成。dsh-session-continuity(维护者 ymck-x)走的是另一条路:在新会话的第一个模型步骤注入一条很小的接续指针,不调用模型、不额外生成;没有工作区交接文档时,优先复用 DSH 已有的压缩摘要(compaction/summary),把「随身携带全文」改成「指针 + 按需 read」。
这是什么¶
插件包名 dsh-session-continuity,分类为记忆,当前 npm 版本 0.3.2,许可证 MIT。它解决的是同工作区新开对话时,如何低成本知道「上一个会话是谁、该读什么」;指针开头会写明「与当前请求无关就忽略」,语义上是背景而非当前任务。语言默认 language: auto,跟随本轮用户消息(有中日韩文字则用中文指针)。
目录页:skillhub.cn/plugins/ymck-x/dsh-session-continuity
源码与说明:github.com/ymck-x/dsh-session-continuity
核心功能¶
注入时机与失败策略¶
只在本会话 turn 1 / step 1 注入一次;--continue 恢复的会话不会注入。任何失败(会话查询不可用、文件读不到、标题读不出)时不注入,原样放行,不影响正常对话。注入消息带来源 kind: 'session-continuity',可在会话记录里识别。
三级材料(按优先级)¶
工作区里没有其他会话时不注入任何东西。有上一个会话时,按顺序取第一档可用材料:
- 工作区交接文档:在
handoffPaths配置的路径里取第一个存在的文件(默认包含.dsh/handoff.md、HANDOFF.md等)。有文档时指针只指向路径与元信息,实测约 55 token(约 220 字节) 量级。 - 上个会话的压缩摘要:无交接文档时,从 DSH 已生成的摘要里按重要性挑小节(
Current Work→Next Step→Pending Jobs→Primary Request and Intent→Critical Context),受summaryBytes预算约束;README 实测约 250 token(约 900 字节) 量级。 - 最后两句:连摘要也没有时,带用户与助手各一句结尾(受
tailBytes约束),并提示需要完整历史时让用户用@引用。
若只想纯指针、不带摘要与结尾,可设 summaryBytes: 0 且 tailBytes: 0。
「上一个会话」怎么选¶
从 sessionQuery.listSessions() 取列表:优先工作目录相同且排在最前的会话;没有同目录则退回全局最新。子代理会话(header 带 parentSession)不算上一个会话,避免指针指向一次工具调用。
与 @ 引用、现写摘要的对比¶
README 中的对照(百万 token 窗口下 @ 单源上限约 80 万字节 ≈ 20 万 token;本插件有交接文档时约 55 token,复用摘要时约 250 token,且零生成):
| 做法 | 新会话一次性吃进 |
|---|---|
@ 引用上一个会话 |
上限约 20 万 token 量级 |
| 调模型写交接摘要 | 约 1k~2k token,每次收尾都要花 |
| 本插件(有交接文档) | 约 55 token,一次 |
| 本插件(复用压缩摘要) | 约 250 token,一次,零生成 |
指针注入一次后留在历史里,后续轮次可命中前缀缓存;模型需要细节时自行 read 交接文档。
安装与启用¶
插件以当前 DSH 进程权限运行,安装前请自行查看源码与 MIT 许可证。装完后执行 dsh --profile <profile> --dump-config,确认组合包已贡献配置层,再启动;若 DSH 在安装前已运行,需重启后新组合才会加载。
从 npm 安装(推荐)¶
dsh plugin --profile <profile> add dsh-session-continuity
锁版本示例:
dsh plugin --profile <profile> add dsh-session-continuity@0.3.2
从 GitHub 安装¶
固定 tag:
dsh plugin --profile <profile> add https://github.com/ymck-x/dsh-session-continuity/archive/refs/tags/v0.3.2.tar.gz
移除¶
dsh plugin --profile <profile> remove dsh-session-continuity
Desktop / Web 也可在侧边栏插件页安装组合包,或让 Agent 调用 plugin_manager 的 install_bundle,target 填本目录绝对路径;装完后开新会话验证第一步是否带指针。
配置¶
在 profile 的 cordis.patch.yml 中覆盖插件 config,例如:
- id: session-continuity
name: dsh-session-continuity
config:
enabled: true
language: zh
handoffPaths: ['.dsh/handoff.md', 'HANDOFF.md']
maxTitleChars: 48
| 字段 | 默认 | 含义 |
|---|---|---|
enabled |
true |
false 时停止注入,不必卸载 |
language |
auto |
跟随用户消息,或写死 en / zh |
handoffPaths |
见 README 默认列表 | 相对工作目录,取第一个存在的路径 |
maxTitleChars |
48 |
标题过长则截断 |
summaryBytes |
1500 |
复用压缩摘要的最大字节;0 表示不用 |
tailBytes |
500 |
末尾两句的字节预算;0 表示不用 |
典型用法与配套¶
三级材料里,只有交接文档需要人维护;压缩摘要与最后两句由插件自动处理。
- 在项目
AGENTS.md约定:收尾把进度、下一步、未解决问题写入.dsh/handoff.md(不想进仓库可加入.gitignore)。 - 或使用
/handoff技能但把落点改到工作区——DSH 自带handoff默认写在系统临时目录,本插件找不到,需改技能或复制一份写到.dsh/handoff.md。 - 不写交接文档也能接上话(靠摘要或最后两句);写了文档,指针更准、token 更省。
有交接文档时,中文提问下指针形态类似(README 示例):
(背景,与当前请求无关就忽略)这个工作区里,你上一个会话是「给 DSH 写一个会话接续插件」(2026-10-13,id 1f759b89)。如果确实接着它做,动手前先读 HANDOFF.md(2026-10-14)。
适用场景与注意¶
适合:同一工作区频繁新开窗口、希望模型知道「上一个会话标题 + 该读哪份 handoff 或摘要要点」、且不想每次 @ 整段历史或让模型重写摘要的 DSH 用户。
注意:
- 模型不能代替用户
@引用会话;无交接文档时指针只能提醒用户去引用。 - 「上一个会话」按创建时间排序,不是最后活动时间。
- 无交接文档且会话很短时,指针可能只剩标题与时间,价值有限。
- 已知未覆盖:多 profile 并行、受限沙箱下工作区文件可见性等。
逻辑测试:node test/run.mjs(README 记载 30 项通过)。仓库在 GitHub 上当前星标为 1。
结尾¶
dsh-session-continuity 把换窗接续做成一次性的极小注入:有 HANDOFF.md 时约 55 token 的指针,没有时零成本搬 DSH 压缩摘要,全程不调模型。需要安装命令、配置字段与行为细节时,以 README 为准。