前言¶
用 DSH 做日常开发,会话管理大多是琐碎活:旧会话在侧边栏越堆越多,删一个要先翻列表;归档后的会话想再翻一眼内容并不方便;某一轮回答跑偏了,希望从那一轮直接重来,而不是重开会话贴一遍上下文;想在所有会话里注入一段固定的系统提示词,又不想改核心源码。
下面介绍的 dsh-session-kit 就是围绕这些场景做的插件。它不修改 DSH 核心源码,而是通过官方扩展点,把删除、归档、轮次操作、话题导航、本地记忆与召回、运行时提示词与压缩配置这一整套会话页管理能力挂到 DSH 上。
这是什么¶
dsh-session-kit 是 ltxlong 维护的 DeepSeek Harness 插件,当前版本 1.1.0,License 为 MIT。一句话定位:不修改 DSH 核心包,通过官方扩展点增强 DeepSeek Harness 会话页的日常管理能力。
按照 DSH「一切皆插件」的设计思路,插件的增删都应该不影响核心。dsh-session-kit 遵守了这一点:全局提示等运行时注册在插件停用、卸载或未加载后会被释放,DSH 回到原本的系统提示词与压缩配置。
安装¶
从 npm 安装(推荐):
dsh plugin --profile web add dsh-session-kit
也可以从 GitHub 安装:
dsh plugin --profile web add github:ltxlong/dsh-session-kit
安装后进入会话页,头部会出现「会话管理」按钮,说明插件已挂载。
核心功能¶
会话管理菜单¶
「会话管理」按钮打开的菜单覆盖以下操作:
- 删除会话:会话停止后经确认删除;运行中的会话受保护,整个会话删除始终禁用。Windows/macOS 尽量移入系统回收站/废纸篓,没有回收站集成的平台会直接删除会话目录。
- 重新命名:通过官方 Session API 修改当前会话标题。
- 分叉会话:当前轮次允许分叉时,从当前会话创建一个新会话。
- 归档会话:把当前会话加入工作区归档列表,从侧边栏隐藏。
- 打开目录 / 导出会话:用系统文件管理器打开当前会话日志目录;导出调用 DSH Session 日志的导出能力。
- 统计调用:按工具名统计当前会话的工具调用,显示总数、成功、失败、未完成次数。
归档会话管理¶
菜单里的「打开归档」进入归档管理弹窗,针对已归档(从侧边栏隐藏)的会话:
1、按标题搜索归档会话;
2、不恢复会话也能直接在弹窗中预览内容,预览中展示工具调用统计,支持分页加载更多消息;
3、把归档会话分叉到新聊天中继续;
4、恢复归档会话,让它重新出现在会话列表;
5、打开归档会话所在文件夹;
6、确认后删除。正在运行的归档会话不会被删除。
轮次删除与重新生成¶
插件会在已完成的顶层助手轮次旁,以及部分失败轮次尾部增加两个操作:
- 此轮到后续全删除:从选中轮次开始,删除当前轮及其后所有已完成轮次在当前 conversation surface 与后续模型上下文中的内容,不会删除整个 Session。
- 重新生成:先从选中轮次开始删除后续内容,再把该轮原始用户提问重新加入队列,让模型从该位置重新回答。
这是会直接改动会话状态的操作,插件采取保守策略:
- 删除不是抹掉 append-only 日志,而是追加持久的 replacement tombstone,tombstone 的 provider/model 为
dsh-turns-del/tombstone。折叠后的 active surface 不再展示被删除范围,后续模型上下文不再包含这些内容,但原始事件仍保留在会话日志中。 - 修改 live session 前会取得 Agent maintenance lease,成功返回前执行
sessions.flush()。 - 每个目标轮次都会验证是否仍对应独立、连续的 surface 区间;轮次已被压缩、与保留历史混合、或与已有删除范围重叠时,直接拒绝,不做猜测处理。
- 重新生成只在 Agent 未运行、输入队列无待处理内容、且选中轮次存在唯一纯文本用户提问时执行。
话题快捷导航¶
每个会话页右侧会显示类似 chat.deepseek.com 的话题导航:
- 默认收起为一列扁平线条标记,鼠标悬浮或键盘聚焦后展开固定尺寸的可滚动面板;
- 用户提问以单行省略标题展示,完整标题只通过系统 tooltip 显示;
- 滚动会话时自动高亮当前话题,点击话题平滑跳转;
- 屏幕宽度较小时自动隐藏。
记忆管理与召回¶
侧边栏「记忆」按钮打开记忆管理弹窗,操作的是本地 SQLite 记忆库,路径为 <profile>/.dsh-session-kit/memory.sqlite:
- 项目:记忆按项目归组,内置
default项目;支持新建/重命名/删除项目,可为项目配置自动启用的会话 ID。 - 临时 / 永久记忆:每轮对话蒸馏产出的临时记忆默认不落库,确认「存储」后写入本地库;支持激活/停用、编辑、跨项目移动与删除。
- 标签:预置标签(用户画像、项目约束、模块路径等)与自定义标签,可即时激活/停用。
- 激活占比:左侧导航底部以环形图实时显示永久记忆的激活比例。
- 召回开关:自动蒸馏每次对话、全部会话启用 default、对话自动匹配项目(每轮增量匹配,仅新启用的项目会通知)。
自动召回在每轮用户消息时执行:用 jieba + CJK 二元组分词(分词依赖 @node-rs/jieba),FTS5 BM25 相关性排序,叠加标签权重与时间衰减;命中结果按轮次注入模型上下文,弱输入轮继承上一轮记忆;FTS 不可用时自动回退子串扫描。索引按分词器版本戳在后台分批异步重建,不阻塞启动。
同时提供 memory_search 工具供 Agent 主动检索记忆,并在每轮消息旁提供记忆面板,显示该轮上下文中真实携带的记忆。注入命中以快照随会话日志持久化,重启后仍可回看(含临时记忆命中),记忆的后续编辑/删除不影响历史轮的显示。
运行时全局提示与压缩配置¶
- 全局提示:会话管理 → 全局提示,打开「全局提示词设置」弹窗,可启用/关闭、编辑提示词内容,保存成功后有提示。Host 端通过
ctx.systemPrompt.section()把提示词注册到运行时系统提示词组装中,不修改 DSH 官方代码,也不覆盖官方system-prompt配置。插件停用、卸载或未加载后,这段运行时注册会被释放,不再生效。 - 压缩配置:仅在运行时覆盖当前压缩引擎,不写入官方或预设配置文件。
典型用法¶
结合上面这些能力,几个常见流程是这样的:
1、管理堆积的会话:会话页头部点「会话管理」→「归档会话」把旧会话从侧边栏隐藏;之后需要时点「打开归档」,按标题搜索、弹窗预览内容,再决定恢复、分叉到新聊天还是删除。
2、某轮回答跑偏后重来:在该轮旁选「重新生成」。插件会校验该轮未被压缩、与保留历史无混合、且存在唯一纯文本用户提问,通过后删除该轮后续内容并重放原始提问。
3、注入固定提示词:会话管理 → 全局提示,编辑内容并开启开关。提示词通过运行时注册生效,不改官方配置文件,关闭插件即失效。
4、沉淀项目记忆:侧边栏「记忆」按钮打开记忆管理弹窗,维护临时/永久记忆与标签;每轮对话自动蒸馏与召回,Agent 也可通过 memory_search 工具主动检索。
实现与文件结构¶
如果想在安装前审查源码,可以对照仓库里的这几个文件:
lib/index.js:Host 路由、全局提示运行时注册、归档/会话操作、轮次删除与重新生成逻辑。lib/client.js:Web UI Slot、全局提示弹窗、其他弹窗、话题导航、轮次操作、样式与 locale 字典。lib/memory.js:本地记忆库(SQLite)、jieba/二元组分词召回、蒸馏与后台索引重建逻辑。cordis.patch.yml:插件 bundle 插入 patch。
适用场景与注意事项¶
适合的用户:会话数量多、需要归档与找回的 DSH 重度使用者;经常需要从某一轮重试的人;想在本地沉淀项目记忆并自动召回的团队或个人;需要在运行时注入全局提示词、但不想改核心配置的人。
使用前请注意:
1、插件以当前 dsh 进程的权限运行,可以读写会话日志和本地文件。安装前建议自行审查源码与许可证(MIT)。
2、记忆库是本地 SQLite 文件(<profile>/.dsh-session-kit/memory.sqlite),删除项目或记忆不可恢复;卸载插件不会自动删除记忆库文件。
3、运行中的会话始终禁用整个会话删除;轮次删除/重新生成采取保守策略,遇到已压缩或不安全的历史会直接拒绝。
4、被删除的内容只是不再展示、不再进入后续模型上下文,原始 append-only 事件仍保留在会话日志中,对日志留存有要求的用户需要知晓这一点。
小结¶
dsh-session-kit 把会话管理里琐碎的删除、归档、轮次重试、记忆沉淀收进一个插件,全程走官方扩展点,不动 DSH 核心源码,卸载后环境也能干净还原。仓库与收录页:
- GitHub:https://github.com/ltxlong/dsh-session-kit
- 社区目录页:https://www.skillhub.cn/plugins/ltxlong/dsh-session-kit (社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系)