dsh-Session-Turncate:按会话空闲时间截断 DSH 上下文

前言

在 DeepSeek Harness(DSH)里,一个 Session 可以长期存活——例如手机 IM 机器人始终把消息投递到同一会话。不同任务因此共用一份对话上下文,旧任务的内容会带进新任务,既污染语义,也持续消耗 token。宿主自带的上下文压缩通常会生成摘要;若你只想在「长时间没有输入」之后整段丢弃更早的对话、且不调用模型写摘要,就需要按会话维度的空闲截断策略。下面介绍社区插件 dsh-Session-Turncate(维护者 L7X6899,分类:工作流),它针对单个会话做定时上下文截断,属于 DSH「一切皆插件」生态中的独立组件;插件目录页在 SkillHub,与 DeepSeek / 幻方无官方从属关系。

这是什么

dsh-Session-Turncate 的定位是:Per-session idle-time context truncation for DSH Web——按可配置的空闲小时数,在下次处理消息时丢弃更早的整段对话(不生成摘要),并在会话里留下与内置压缩一致的事务形状,避免历史「凭空消失」。

  • npm 包名:dsh-session-turncate,显示名:dsh-Session-Turncate,当前版本 0.1.2(MIT)
  • 宿主要求:dsh >= 0.2.1-rc.5(见 engines.dsh)
  • 源码与说明:GitHub — L7X6899/dsh-Session-Turncate

需要强调:这是「截断」,不是「压缩」。被丢弃的内容不会留下摘要,也不会再出现在模型输入里。

核心功能

按会话开关与空闲计时

每个 Session 可单独启用。开启后,只要距上一次活动已满 X 小时,在本轮第一个 step 开始时触发自动截断;每次用户输入都会刷新空闲计时(0.1.1 起语义为空闲超时,而非固定间隔)。

自动截断在每一步开始时判断,且只在本轮第一个 step 执行:本轮已产生的 surface 节点不会被替换;存在未闭合的 compaction/start 时跳过;hours <= 0 或开关关闭时不触发。

Web 面板:「上下文截断」选项卡

会话区域顶部功能栏(slot conversation.view,order 40)新增 上下文截断:

区域 行为
上下文管理 开关:启用后长时间无输入时会自动重置上下文
自动截断上下文时间 数字输入,单位小时,范围 0–24;0 表示不按时间自动截断
保存 写入该会话的开关与小时数
立即截断 立刻执行一次截断(不受时间限制)
状态行 上次截断时间、累计次数;0.1.2 起还有「下次」时间与排队提示

面板通过同源 HTTP 与宿主通信:POST /session-turncate/api,op 为 status / set / cut。仅接受 loopback 或同源请求,跨源返回 403。

斜杠命令与 IM 桥接

/truncate on 4     # 开启,4 小时无输入后截断
/truncate on       # 只开启,沿用已保存的小时数
/truncate off      # 关闭
/truncate now      # 立即截断一次
/truncate status   # 查看当前会话状态

中文别名:/截断 on 6、/cut off 等同样可用。通过 IM 桥接直接发消息、且不经过命令注册表时,该行必须以 /、/ 或 ! 开头,否则会被当成普通对话,例如 !截断 on 2 会生效,截断 on 2 不会。每次开关或截断会有一条回执消息,便于手机端查看结果。

持久化与截断写入方式

状态文件默认路径:$DSH_HOME/session-truncate.json(即 ~/.dsh/session-truncate.json),按 Session id 记录;进程重启后仍有效。手动编辑该文件同样生效;解析失败时坏文件会另存为 .corrupt 后重置。

截断严格沿用内置压缩后端的事务形状,Chat 中会显示「已压缩」折叠卡:

  1. compaction/start
  2. compaction/summary(固定文案,声明按时间策略移除、未生成摘要;provider 为 session-turncate)
  3. 一条 user/message(source.kind 为 compact-checkpoint),带 surfaceOp: { op: 'replace', startSeq, endSeq }
  4. compaction/end

compaction/start|end 的 turn 字段必须存在(无 turn 时写 null),否则会话下次加载可能因格式校验失败而报错。

任何异常只记一条 warn 日志,原样继续本轮对话;插件出错不会中断会话。状态文件写入失败时,面板与命令会明确返回「本次操作未生效」。

安装与启用

插件以当前 DSH 进程权限运行,安装前应自行查看源码与 MIT 许可证。

从 GitHub(推荐)

# 把 desktop 换成你实际使用的 profile 名
dsh plugin --profile desktop add github:L7X6899/dsh-Session-Turncate

也可在桌面端 设置 → 插件 中安装。装完后重启 DSH(宿主按 ESM 模块缓存加载插件)。

从 npm

npm i dsh-session-turncate@0.1.2
# 或装进当前 profile
dsh plugin --profile desktop add dsh-session-turncate

包页:https://www.npmjs.com/package/dsh-session-turncate(dist-tag latest = 0.1.2)。

典型用法

  1. 在 Web 打开长期 IM 桥接会话,进入 上下文截断,打开开关并设置例如 4 小时,点 保存。
  2. 或在会话里发送:/truncate on 4;需要立刻清空旧上下文时发送 /truncate now 或点 立即截断。
  3. 用 /truncate status 或面板状态行确认上次截断、累计次数与(0.1.2)下次触发时间。

状态 JSON 中常见字段:enabled、hours(0–24)、keepRecentNodes(保留末尾 surface 节点数,默认 0)、lastActiveMs、lastCutMs、cutCount。旧字段 anchorMs 会自动迁移为 lastActiveMs。

仓库自带 Node 自测脚本(无需启动 DSH),例如 node test/truncate.mjs、node test/api.mjs 等,可在本地验证行为。

适用场景与注意

适合:同一 Session 长期在线、任务彼此独立、希望用「空闲超时」硬切上下文、且接受不保留摘要的场景(IM 机器人桥接是 README 中的典型例子)。

不适合:需要保留被删内容的语义摘要时,应使用宿主或其他压缩能力,而非本插件。

安装来源以 GitHub README 与 npm 包页为准;版本与配置项以上述资料为准,勿凭插件名自行拼接未文档化的安装命令。

结尾

dsh-Session-Turncate 用 per-session 空闲计时 + 整段丢弃(无摘要)的方式,降低长期会话里的上下文串台与 token 压力,并通过面板、斜杠命令与持久化状态配合 IM 使用。进一步了解可访问 SkillHub 目录页 与 GitHub 仓库。

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

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

小夜