dsh-session-continuity:新会话用约 55 token 接续上个窗口

前言

在 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',可在会话记录里识别。

三级材料(按优先级)

工作区里没有其他会话时不注入任何东西。有上一个会话时,按顺序取第一档可用材料:

  1. 工作区交接文档:在 handoffPaths 配置的路径里取第一个存在的文件(默认包含 .dsh/handoff.md、HANDOFF.md 等)。有文档时指针只指向路径与元信息,实测约 55 token(约 220 字节) 量级。
  2. 上个会话的压缩摘要:无交接文档时,从 DSH 已生成的摘要里按重要性挑小节(Current Work → Next Step → Pending Jobs → Primary Request and Intent → Critical Context),受 summaryBytes 预算约束;README 实测约 250 token(约 900 字节) 量级。
  3. 最后两句:连摘要也没有时,带用户与助手各一句结尾(受 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 表示不用

典型用法与配套

三级材料里,只有交接文档需要人维护;压缩摘要与最后两句由插件自动处理。

  1. 在项目 AGENTS.md 约定:收尾把进度、下一步、未解决问题写入 .dsh/handoff.md(不想进仓库可加入 .gitignore)。
  2. 或使用 /handoff 技能但把落点改到工作区——DSH 自带 handoff 默认写在系统临时目录,本插件找不到,需改技能或复制一份写到 .dsh/handoff.md。
  3. 不写交接文档也能接上话(靠摘要或最后两句);写了文档,指针更准、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 为准。

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

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

小夜