DSH 会话管理:列出全部会话并显示各自的磁盘占用,可按标题、会话 ID、类型标签、工作区或 agent preset 搜索,并按时间或工作区分组。支持单个或批量永久删除——同时清除日志文件、工作区账目与搜索索引,删除前两步确认、删除后复验;可按需显示子代理会话,侧边对话线程始终隐藏,本次启动中活动的会话会被拒绝直到重启。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:BakaCirno233/dsh-session-delete
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
DeepSeek Harness (DSH) 插件:在 设置 → 会话管理 中列出所有会话,并永久删除不需要的会话。
功能
删除语义
- 删除该会话的持久化日志(
~/.dsh/sessions/<项目>/<session-id>/) - 从所有工作区的会话账目中摘除(
workspaceRegistry.detachSession) - 搜索索引(SQLite FTS)在下一次查询时自动同步清理
- 两步确认防误删;删除前后都会校验,删除后验证持久化列表不再包含该会话
- 每次删除都写日志(成功
info、异常warn);工作区账目摘除失败会作为warnings回传界面,而不是被静默吞掉
活动会话限制:本次启动中打开过的会话(包括正在查看的当前会话)会被拒绝删除——活动 Agent 会重写日志,删除不彻底。重启应用后这些会话变成冷会话,即可正常删除。历史会话(此前运行留下的)随时可直接删除。
列表与批量操作
- 子代理会话:DSH 的会话列表默认隐藏
origin: "subagent"的会话。勾选 「显示子代理会话 (N)」 即可列出它们(N 是当前被隐藏的数量)。 - 侧边对话隔离:better-sidebar 的 Side Chat 线程同样带
subagent标记,但它们不是子代理。本插件按Side:标题前缀识别,永远不显示——删掉它会让侧边栏那个对话标签页变成孤儿。 - 搜索:匹配标题、会话 ID、类型标签(
子代理/subagent、主会话/main)、工作区路径、以及 agent preset(qq-chat、cordis等)。输入子代理(或其前缀agent)会自动放开隐藏,一次列出全部子代理会话。 - 分组:下拉切换 按时间(今天 / 近 7 天 / 近 30 天 / 更早)或 按工作区(会话创建时的
cwd,按会话数量降序;无 cwd 的归入「未知工作区」)。 - 批量选中:整组勾选 / 全选 / 单行勾选三级。选中范围严格跟随屏幕上可见的条目——被搜索词或隐藏开关过滤掉的会话不会混进批量删除。分组标题右侧显示该组数量与合计占用。
- 批量删除:逐个串行请求并显示进度(
删除中 12/357),单条失败只计入失败数、不中断整批,结束后汇总成功与部分失败。 - 占用大小:每行显示该会话日志文件的体积,便于判断先清理哪个。
安全设计
- 删目录有守卫:递归删除会话目录前校验「目录名 == 会话 id」(DSH 一直如此命名)。一旦路径形态变化导致不匹配,就只删日志文件并记一条
warn,绝不盲目rm -r——那可能带走整个工作区分组。 - 定位失败不再假装成功:
sessionPersistence.locate()抛错时返回失败,而不是当成「没有产物」。 - 状态未知即禁用:host 列表接口不可用时,界面显示错误提示并禁用所有删除按钮,不会把「拿不到活动状态」当成「全都是冷会话」。
- 请求有超时:前端请求 20 秒超时(
AbortController),host 无响应不会把界面永久锁死。
兼容性
| 宿主 | 状态 |
|---|---|
DSH Desktop 2.0.18 / 内核 0.2.1-rc.2 |
✅ 已验证(安装门禁与所用 API 均通过) |
DSH Desktop 2.0.10 / 内核 0.1.5-rc.2 |
✅ 已验证(sessionPersistence.list() 返回 snapshot,本插件按 snapshot.header 读取) |
内核 < 0.1.5-rc.2 |
❌ 不支持。该代 list() 返回的是裸 header,本插件取不到 id |
宿主代次由
package.json的engines.dsh(>=0.1.5-rc.2 <0.3.0-0)统一声明。DSH 的安装门禁优先读engines.dsh,存在该字段时peerDependencies里的@deepseek-ai/dsh-*不再参与判断——内核升代只改这一处即可,不必逐条改 peer。这条下界来自 2.0.10 的服务语义变化:
sessionPersistence改为按SessionHandle(create/open)寻址,list()返回{ header, sizeBytes, revision }快照。若你的 DSH 更老,请先确认list()的返回结构再装。
安装
在目标 profile 的 package.json(例如 ~/.dsh/profiles/desktop/package.json)中加入依赖与 bundle:
{
"dependencies": {
"dsh-session-delete": "github:BakaCirno233/dsh-session-delete"
},
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"…其他插件…",
"dsh-session-delete"
]
}
}
}
然后在 profile 目录执行 pnpm install,重启 DSH 应用。
使用:设置(齿轮)→ 会话管理。
本地开发(file: 依赖)
"dependencies": {
"dsh-session-delete": "file:<本仓库的绝对路径>"
}
pnpm install 后改 lib/ 里的代码,重启应用即可生效。
注意:
file:依赖在 profile 的node_modules下是副本而不是符号链接。改完仓库代码后需要重新pnpm install(或手动把lib/*.js复制过去),否则运行的仍是旧代码。
结构
lib/index.js— Host 半部:在本地webServer注册两个路由POST /api/session-delete/list→{ sessions: [{ sessionId, live, running, sizeBytes?, agentPreset?, cwd? }] }POST /api/session-delete/delete→{ ok, code?, message?, warnings? }- 文件删除直接使用
node:fs/promises(rm),无需子进程 - 列表结果带 5 秒缓存,避免反复刷新时重复扫描全部会话;删除成功后立即失效
lib/client.js— 浏览器半部:settings.section的「会话管理」页,通过fetch调用宿主路由cordis.patch.yml— 把宿主插件行插入组合(宿主半部)package.json的dsh.client声明让 Web 端自动发现lib/client.js
更新记录
2026-10-26 — 兼容 DSH 2.0.18(内核 0.2.1-rc.2)
修复
- 安装被拒(界面提示宿主版本不对):
peerDependencies里的^0.1.0-rc.5在语义化版本下封顶于0.2.0-0,而 DSH 2.0.18 的内核是0.2.1-rc.2,6 条@deepseek-ai/dsh-*peer 全部不满足,安装 preflight 因此拒绝。现在改用engines.dsh(>=0.1.5-rc.2 <0.3.0-0)统一声明宿主代次;6 条 peer 同步更新为^0.1.5-rc.2 || ^0.2.0-rc.2(仅供包管理器参考,门禁以engines.dsh为准)。 - 版本号
1.0.0→1.0.1:宿主按精确版本判断是否更新,不 bump 的话 pnpm 会认为装上的还是旧版。
验证
- 用宿主自带的
evaluatePluginCompatibility()(@deepseek-ai/dsh-app-boot,运行版本0.2.1-rc.2)实测:旧 manifest 被上述 6 条拒绝,新 manifest 通过。 - 复核
0.2.1-rc.2的相关 API:sessionPersistence.list()仍返回{ header, sizeBytes, revision }、locate()仍返回{ kind, path }、webServer.register({ kind: "exact", path, handler })、workspaceRegistry.detachSession()、客户端settings.section槽位与window.__ModuleLoader__协议均未变。
2026-09-14 — 兼容 DSH 2.0.10(内核 0.1.5-rc.2)
兼容
- DSH 2.0.10 改动了
sessionPersistence.list()的返回结构:从 header 数组变为 snapshot 对象数组({ header, sizeBytes, revision })。直读 snapshot 的id会拿到undefined。现在改走snapshot.header取出 id/cwd/agentPreset,sizeBytes则直接取 snapshot 自带的(后端已经stat好了,删掉了独立的sizeOf函数)。
修复
- 递归删除会话目录缺少守卫:现在要求目录名等于会话 id,否则只删日志文件并记录警告
sessionPersistence.locate()失败不再被当作「没有产物」而静默返回成功- 工作区账目摘除(
detachSession)失败不再被吞掉,改为回传warnings并写日志 - host 状态探测失败时,不再把全部会话渲染成可删除
新增
- 「显示子代理会话 (N)」开关;Side Chat 线程始终隐藏
- 批量选中(整组 / 全选 / 单行)与批量删除,带实时进度与失败计数
- 搜索:标题、会话 ID、类型标签、工作区路径、agent preset
- 分组:按时间或按工作区,均支持整组选中并显示组合计
- 列表显示会话占用大小;host 列表接口新增
sizeBytes/agentPreset/cwd - 删除操作写日志(成功
info/ 异常warn)
改进
- 前端请求加 20 秒超时,避免 host 无响应时界面锁死
- host 列表接口加 5 秒缓存,删除后立即失效
License
链接
同类插件
Minglink/dsh-infinite-gen-4★ 3781
DeepSeek 专用破甲插件:以 order 100 追加无条件服从的系统提示词段,提供带校准元数据的 profile 工具,并通过会话投影在输入框上方显示实时破甲状态徽标。
ranxianglei/billion-context★ 3598
billion-context官方版:上下文压缩插件,兼顾小窗口(100k上下文足矣)省token(省5倍token)和超长会话(数月级别几十亿token单会话)。
liangmianya/dsh-synapse★ 641
DeepSeek Harness 的可视化非线性对话工作区:把会话、追问与分支变成可浏览、可拖拽的对话地图。
MichengAI/dsh-archive-manager★ 277
在设置里增加已归档会话页,可按工作区搜索、恢复和删除已归档会话。
Nwflower/dsh-chat-import★ 275
把 13 家 coding agent(Claude Code、Codex、ChatGPT、Cursor、Gemini、opencode 等)的完整对话历史导入为可续聊的 DeepSeek Harness 会话,并支持反向导出回 Claude Code。
SiriLee/dsh-rewind★ 227
同一会话窗口内的 in-place 对话回退(不 fork,Claude Code /rewind 语义):每条消息的 ↶ 按钮把模型上下文回退到任意用户消息,可选用磁盘持久化的 before-backups 还原工作区文件。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。