为 DSH Web 界面补齐完整的会话管理能力:回收站删除、归档恢复、继续/暂停、未读标记、fork、工作区管理与上下文压缩阈值。
- Language
- TypeScript
- License
- MIT
- Branch
- main
Install
$ dsh plugin --profile web add github:dream12347/dsh-session-managerRun the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial
一句话定位
为 DSH Web 界面补齐一套完整的会话管理能力:在设置页与对话顶部都能访问,支持删除(带回收站可恢复或彻底清除)、恢复已归档会话、继续/暂停会话、查看近期活动统计、打开日志目录、未读/已读标记、fork 到新聊天、工作区分组与排序管理,以及一个对所有 Agent 预设统一生效的上下文压缩阈值。
核心能力
- 删除会话并放入回收站(保留最近 10 条,最早的自动彻底清除),支持恢复或彻底删除
- 在设置页恢复"已归档"分组中的会话回到主列表
- 一键继续空闲会话或暂停正在运行的会话
- 在中心弹窗中查看会话近期活动统计(轮次、用户消息、助手消息、全部工具调用、活动窗口)
- 在系统文件管理器中打开会话的日志目录
- 会话行标题旁显示四态点(手动未读蓝、官方等待输入琥珀、官方完成提醒绿、运行中转圈),并向官方侧边栏同步注入蓝色未读点
- 一键 fork 当前会话到新聊天(调用官方 sessions.fork)
- 工作区分组展示会话、组内按最后使用时间排序,支持拖拽重排、置顶、重命名、删除工作区
- 在"通用设置"中调整上下文压缩阈值(17%–90%),对所有 Agent 预设统一生效并持久化
技术实现
- 语言: TypeScript
- 关键依赖: @deepseek-ai/cordis(插件运行时)、@deepseek-ai/dsh-host-webserver(HTTP 路由)、zod(请求/存储域 schema)、@deepseek-ai/dsh-storage-domain(持久化)、react 18(客户端 UI)
- 架构模式: 标准的 DSH 插件双端结构。
src/index.ts是 host 端,通过ctx.webServer.register暴露 7 条 HTTP 路由(/delete/restore/purge/trash/open-folder/pause/compaction-threshold),并通过ctx.on('agent/pre-step', ...)钩子在每步强制应用阈值。src/client/index.ts是 client 端,通过ctx.slots.inject注册到三个官方插槽:settings.section(独立"会话管理"分栏)、settings.general.item(压缩阈值滑块)、conversation.session.header.utilities(对话顶部的"对话管理"和"删除本对话"按钮) - 入口文件:
src/index.ts(host)+src/client/index.ts(client,导出dsh-session-manager/client)
适用场景
当你日常用 DSH Web 跑大量会话、侧边栏列表越来越长、原生又没有"删除会话"入口时,本插件可以让你回收空间、找回误删的会话、给会话打未读标记方便回头继续、随时打开日志目录排查问题。如果你还关心 token 用量与上下文压缩策略,它也提供了一个全局阈值,无需逐个修改 Agent 预设。
前置依赖与兼容性
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| DSH | >= 0.1.0-rc.6 | 依赖 settings.section / settings.general.item / conversation.session.header.utilities 插槽,以及 ctx.sessionPersistence / ctx.workspaceRegistry / ctx.agents / ctx.storageDomain / ctx.agentPresets 服务 |
| Node | ^22.19.0 或 >=24.0.0 | package.json#engines 声明 |
| 平台 | macOS / Windows / Linux | 通过 open/explorer/xdg-open 在系统文件管理器中打开日志目录 |
| 原生模块 | 无 | host 端仅使用 node 内置模块(fs/path/child_process),client 端无原生依赖 |
安装方式
dsh plugin --profile web add github:dream12347/dsh-session-manager
配置项
| 配置 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| 上下文压缩阈值 | 数字(17–90) | 当会话上下文用量达到模型窗口(100 万 token)的设定比例时自动压缩;保留最近 16% 原文;对所有 Agent 预设统一生效 | 80(即 0.8) |
| 回收站容量 | 数字 | 保留最近 N 条被删除的会话,超出后最早的条目自动彻底清理(不可恢复) | 10 |
上述两项的可见 UI 入口分别是"设置 → 通用设置 → 上下文压缩阈值"(滑块 17%–90%)和"设置 → 会话管理 → 回收站"折叠区。本插件无传统意义的外部配置文件。
常见问题
Q: 安装后需要做什么?
A: 安装后必须重启 dsh web。Host 插件和 client bundle 都在 DSH 启动时加载,不重启新功能不会出现。
Q: 能不能删除正在运行的会话?
A: 不能。删除按钮在运行中的会话上会被禁用,host 端也会拒绝请求并返回 session-live。当前打开但空闲的会话(不再思考)可以正常删除。多标签页场景请先确认该会话在所有标签页都已停止。
Q: 回收站能保留多少条?满了怎么办?
A: 最多保留 10 条。再删除新会话时,最早进入回收站的那条会被自动彻底清理(包括磁盘上的会话目录),无法再恢复。重要会话请及时在回收站里点"恢复"。
Q: 子代理(subagent)会话被删了怎么办?
A: 即使主会话已经删除,子代理会话变成"孤儿"也能在会话管理面板里直接清理,前提是它不在运行中。这样不会有无法清理的残留会话堆积。
Q: "上下文压缩阈值"配置保存在哪里?重启后还在吗?
A: 值持久化在 DSH 存储域 dsh_delete_session(~/.dsh/storages/dsh_delete_session.json)。如果默认 Agent 预设是用户预设,会同步写入对应 agent.cordis.yml 的 compaction-basic 配置;系统预设文件只读不会改写。每次 agent/pre-step 钩子都会把阈值套用到所有预设的压缩引擎上,所以保存即生效,重启后依然生效。
Q: 未读标记和官方未读有什么区别?
A: 官方未读是琥珀色(等待输入)和绿色(完成提醒)的点,点它们会"就地已读"——不跳转页面,只清除官方提醒。本插件的蓝色未读是手动标记,存在浏览器 localStorage 的 dsh.session-unread.v1(与其他会话管理插件互通),点空白处可标记未读,点蓝点可清除未读,打开会话自动已读。
Q: 侧边栏的蓝色未读点会一直准确吗?
A: 官方侧边栏的行元素不带会话 id 属性,本插件按标题文本匹配并用 MutationObserver 注入蓝色点。会话管理抽屉内部按真实会话 id 精确标记,不受影响。重复标题的会话在侧边栏会共享同一个蓝点,这是已知的边角情况。
上手难度
入门 — 安装一条命令、重启 DSH 即可使用,无需阅读文档或修改任何配置文件;唯一的"配置"是通用设置里的压缩阈值滑块。
已知问题与限制
- 不能删除正在思考中的会话;多标签页场景下如果别的标签页打开了同一个会话,请先在那边停止(src/index.ts:414-417)
- 侧边栏未读点按标题文本匹配,重复标题的会话在侧边栏共享同一个蓝点,会话管理抽屉不受影响(README.md:121)
- live 会话(当前进程内打开的会话)删除后,内存状态由 DSH 在重启时彻底清理;这是 DSH 自身行为,非本插件处理
- host 端为保持 WorkspaceRegistry 的缓存与存储域一致,会直接写入
registry.state这个私有字段;README 与源码注释都标注这是对 DSH 升级脆弱的方案,DSH 升级后需要同步适配(src/index.ts:276-289) - 已彻底删除的会话 id 会保留在浏览器 localStorage(防止 live 会话删除后刷新"复活")与归档集合中(无害残留,不显示)(README.md:120)
- 安装后必须重启
dsh web,否则 host 插件与 client bundle 都不会生效(README.md:50) - 压缩阈值的下限 17% 由"阈值必须大于引擎的保留比例 16%"这一硬性约束决定(src/index.ts:697-699 / src/client/index.ts:2235-2236)
English | 中文
这可能是目前功能最全的 DSH 会话管理插件:在 DeepSeek Harness Web 界面中全面管理会话,设置页与对话顶部均提供入口——删除(回收站可恢复或彻底清除)、恢复已归档会话、近期活动统计、继续/暂停会话、打开日志目录、未读/已读标记、新聊天中继续(fork)、工作区分组与排序管理、上下文压缩阈值设置,不修改 DSH 核心代码。
本项目由 dsh + Deepseek-V4-Flash0731 独立完成
如果觉得有用,欢迎点个 ⭐ Star,谢谢支持!
功能
- 设置页新增独立的「会话管理」分栏(与 Notifications 同级的设置分区)
- 面板列出全部会话(标题 / 工作目录),底部折叠区单独展示已归档会话,支持一键恢复回到会话列表
- 回收站:删除的会话移入回收站(保留最近 10 条,超出自动清除最早一条),可恢复或彻底删除
- 统计:每个会话可在居中弹窗中查看完整近期活动统计(轮次 / 用户消息 / 助手消息 / 全部工具调用 / 活动窗口)
- 继续会话:一键打开会话并关闭面板;暂停:停止正在运行会话的当前回合
- 未读 / 已读:会话行标题旁显示状态点——手动未读为蓝色、官方等待输入为琥珀、官方完成提醒为绿色、运行中为转圈;点击官方状态点就地已读(不跳转),点击蓝色点清除未读,打开会话自动已读;官方侧边栏的对应会话行旁同步显示蓝色未读点
- 新聊天中继续:每个会话一键 fork 子会话(官方
sessions.fork)并打开 - 文件夹:在系统文件管理器中打开会话日志目录
- 删除本对话:对话顶部右侧红色按钮,一键删除当前对话(Session log 左侧)
- 对话管理 / 回收站:对话顶部入口,打开自绘右侧抽屉(图钉固定常驻、点击外部自动收起),行内「更多」悬浮菜单收纳统计 / 文件夹 / 新聊天中继续
- 工作区管理:会话按工作区分组展示,组内按最后使用时间排序(可切换最新/最旧);拖拽工作区标题即可调整顺序(插入 / 交换 / 拖到末尾);悬停标题出现置于顶部 / 重命名 / 删除按钮(删除按官方定义:仅移出列表,文件夹与会话记录保留,会话归入「未分组」)
- 上下文压缩阈值(通用设置):设置对话上下文用到模型窗口(100 万 token)的多少比例时自动压缩(17%–90%),每次压缩保留最近 16% 原文;对所有 Agent 预设的会话统一生效(保存即时 + 持久化 + 重启自动应用)
- 删除限制:仅禁止删除「正在思考」的会话;当前打开的会话(空闲)可删除
- 子代理(subagent)会话支持删除(非运行中):即使主会话已删除、子代理成为「孤儿」,也能在会话管理中直接清理
- 中英文界面自适应(跟随页面语言)
安装
从 GitHub
dsh plugin --profile web add 'github:dream12347/dsh-session-manager#v0.2.2'
从本地目录
dsh plugin --profile web add /absolute/path/to/dsh-session-manager
从 tarball
pnpm pack
dsh plugin --profile web add /absolute/path/to/dsh-session-manager-0.2.2.tgz
安装完成后重启 dsh web(host 插件与客户端 bundle 需要重启加载)。
截图
设置页「会话管理」分栏(工作区分组、行操作与回收站):

对话顶部快捷入口(对话管理 / 回收站 / 删除本对话):

会话管理抽屉(工作区分组、图钉固定、点击外部收起):

通用设置「上下文压缩阈值」(17%–90%,滑块刻度):

使用
设置页会话管理
- 打开侧边栏底部 设置(齿轮图标)
- 设置页面左侧导航出现独立的 会话管理 分栏,点击进入
- 主列表为未归档会话;底部「已归档会话」折叠区可展开查看、恢复或删除归档会话
- 删除会话 → 进入底部「回收站」折叠区(保留最近 10 条)
- 回收站内可 恢复(回到会话列表)或 彻底删除(永久清除,不可恢复)
- 每行操作:继续会话(打开并进入对话)、暂停(停止正在运行的回合)、统计(展开近期活动)、文件夹(打开日志目录)、删除
- 工作区标题右侧(悬停显示):置于顶部(挪到最前)、重命名、删除(红色,二次确认)
- 拖拽工作区标题可调整顺序:放到某个工作区上方/下方插入,放到标题上交换位置,拖到最下方即移到末尾
- 排序按钮(最新在前 / 最旧在前)切换组内会话的排列顺序
通用设置:上下文压缩阈值
- 打开 设置 → 通用设置(General)
- 找到「上下文压缩阈值」:滑块 / 输入框设置 17%–90%
- 保存后立即生效(含已打开的会话);配置对所有 Agent 预设统一生效,重启后依然有效
对话顶部快捷入口
任意对话页右上角(Session log 左侧):
- 对话管理:打开会话管理抽屉(完整列表 + 已归档 + 回收站),图钉可固定常驻,点击外部自动收起
- 回收站:打开抽屉并直接展开回收站
- 删除本对话(红色):确认后删除当前对话(移入回收站)
未读 / 已读状态点
会话行标题旁的圆点表示四种状态:蓝色=手动标记未读、琥珀=官方等待输入、绿色=官方完成提醒、转圈=运行中。点击琥珀 / 绿色点就地标记已读(不跳转,仅清除官方提醒);点击蓝色点清除未读;点击空白位置标记未读;打开会话自动已读。官方侧边栏的会话行旁同步显示蓝色未读点(按标题文本匹配,重复标题会话会共享该点)。
工作原理
| 层 | 实现 |
|---|---|
| Host | src/index.ts 注册 7 条路由:POST /delete(归档 + 非 live 会话文件移入回收站 + 记录条目)、POST /restore(文件移回 + 取消归档 + 删除条目)、POST /purge(清除回收站与原位置文件 + 删除条目)、GET /trash(回收站列表)、POST /open-folder(打开日志目录)、POST /pause(暂停运行中会话)、`GET |
| Client | src/client/index.ts 通过官方 settings.section 插槽注册独立分栏,用 useSessions / useWorkspaces 标准数据源列出会话(含归档/回收站分组),删除/恢复/彻底删除调用 host 路由;抽屉通过 sessions.list(ObservableSnapshot)订阅实时列表;彻底删除的会话 id 记录在浏览器 localStorage,避免 live 会话删除后刷新「复活」 |
- 未读机制:手动未读集保存在浏览器 localStorage 的共享 key
dsh.session-unread.v1({version:1, ids:[]}格式,与其他会话管理插件互通);官方状态点(琥珀/绿色/转圈)由官方SessionSummary的pendingInteraction/completed/running字段驱动,点击就地已读通过清除官方提醒标记实现,无需打开会话;侧边栏的蓝色未读点由 MutationObserver 装饰官方树节点(官方行元素没有会话 id 属性,故按标题文本匹配) - 压缩阈值全局生效:保存在存储域(
dsh_delete_session的thresholdRatio);如果默认 Agent 预设是用户预设,则同时写入 agent-presets 服务解析出的agent.cordis.yml,系统预设文件保持只读。host 在每个agent/pre-step钩子里把阈值写入所有预设的压缩引擎配置,因此对所有 Agent 预设的会话统一生效,重启后依然有效 - 删除时先走官方归档通道:侧边栏立即隐藏该会话
- 回收站条目持久化在 DSH 存储域(
~/.dsh/storages/dsh_delete_session.json),文件在~/.dsh/dsh-delete-session-trash/ - 工作区记账(
sessionIds槽位)在下次启动时由 registry 重建索引自动对账,无需手动编辑文件 - 无系统提示词改动、无模型工具新增,对 token 与模型行为零影响
限制
- 不能删除正在运行的会话(按钮禁用并拒绝删除),多标签页场景请先在别处确认该会话已停止
- 子代理会话可删除(非运行中),包括主会话已删除的「孤儿子代理」——不会再有无法清理的残留会话
- live 会话(当前进程内打开的会话)删除后,其内存状态由 DSH 在重启时彻底清理
- 已彻底删除的会话 id 会保留在浏览器 localStorage(防止刷新后重新出现)与归档集合中(无害残留,不显示)
- 侧边栏未读点按标题文本匹配,存在重复标题的会话时两者会共享同一个点(会话管理抽屉内不受影响,按真实会话 id 精确标记)
兼容性
当前版本适配 DSH 0.1.0-rc.6(依赖 settings.section / settings.general.item / conversation.session.header.utilities 插槽与 ctx.sessionPersistence / ctx.workspaceRegistry / ctx.agents / ctx.storageDomain / ctx.agentPresets 服务)。DSH 版本升级后如插槽或服务 API 变化,需要同步适配。
开发
pnpm install # 安装依赖(@deepseek-ai 系列为 link 本地开发依赖)
pnpm run check # typecheck + test + build
lib/ 为提交的构建产物,修改源码后必须重新构建并提交 lib/。