前言¶
在 DeepSeek Harness(dsh)里用 Web GUI 管会话时,官方 0.2.x 侧边栏会话行的 ⋯ 菜单通常只有 rename、fork、pin、archive,没有「删掉这条会话并清掉日志」的入口。归档只能把会话从主列表藏起来,磁盘上的 <DSH_HOME>/sessions/... 日志目录仍在;试验性会话、误建分支或需要腾空间时,缺少一步到位的删除动作。
下面介绍社区插件 @mcf171/dsh-session-delete(维护者 mcf171,MIT 许可证,当前 package 版本 0.1.0)。它在不劫持侧边栏 DOM 的前提下,用官方扩展点增加菜单项「删除会话」和快捷键 Delete,经确认后按固定顺序归档、删除日志目录并广播 UI 移除事件,让该行立刻从侧边栏消失。
这是什么¶
@mcf171/dsh-session-delete 是给 DSH Web GUI 补永久删除会话动作的 bundle-patch 型插件:host 端注册同源路由,client 端注册会话行菜单与快捷键。代码在 lib/ 下为手写 JavaScript,改完重启 DSH 即生效,无需单独编译步骤。
- 目录页:https://www.skillhub.cn/plugins/mcf171/dsh-session-delete
- 源码与说明:https://github.com/mcf171/dsh-session-delete
SkillHub 为社区插件目录,与 DeepSeek / 幻方无官方从属关系;安装前请自行查看仓库源码与许可证。插件在当前 dsh 进程权限下执行文件删除,仅删该会话的日志目录,不可撤销,依赖确认框把关。
核心功能¶
删除流程(顺序固定)¶
一次删除按下面顺序做三件事,顺序不能调换:
- 先归档:调用
workspaceRegistry.archiveSession(id)。这是官方持久化隐藏机制,主列表不再显示该会话,后续列表刷新也不会把它带回来。若会话正在跑回合,归档会拒绝并提示「该会话正在运行,请先停止后再删除」(与官方活动检查一致)。 - 再删日志目录:删除
<DSH_HOME>/sessions/<projectKey(cwd)>/<sessionId>/。目录已不存在时跳过,重复删除幂等、不报错。 - 广播
api-session/removed:复用官方session/disposed → api-session/removed中继,client 收到后立刻从 UI 移除该行。
必须先归档再删日志:日志删掉之后再归档会抛 WorkspaceUnknownSessionError。
界面与快捷键¶
- 会话行
⋯菜单增加「删除会话」,左侧为与官方一致的垃圾桶图标,右侧提示快捷键Delete,危险色标注。 - 快捷键
Delete作用于当前选中的会话,流程与点击菜单相同(运行中拒绝 → 确认框 → 删除)。以下情况不触发:焦点在输入框或可编辑区域、带Ctrl/Shift/Alt/Cmd的 Delete、当前无选中会话。
设计边界(README 中明确说明)¶
- UI 注册在官方插槽
sidebar.workspaces.session.menu.item,不监听、不改写侧边栏 DOM。 - 「运行中」判断与官方列表一致:
agents.get(id).status === 'running',只拦正在跑回合的会话。 - 删除走
node:fs,目标路径按@deepseek-ai/dsh-session-persistence-jsonl的projectKey/encodeSegment规则定位,遵循DSH_HOME。 - 不要在删除后调用
sessions.refresh():列表 = 持久化扫描 + 内存中的活会话,立刻刷新可能把刚移除的行加回来。清理靠归档与广播。 SessionStore无移除 API,打开过的会话对象可能常驻内存直到进程重启;不影响使用,行已从 UI 消失且不会再写已删日志。
安装与启用¶
资料中未提供 dsh plugin add github:... 一类命令;需把包挂到某个 profile(以下以 profile web、路径 <DSH_HOME>\profiles\web 为例)。
1、放入 profile 的 node_modules¶
scoped 包位于 @mcf171\ 子目录。复制示例(PowerShell):
$dest = '<DSH_HOME>\profiles\web\node_modules\@mcf171\dsh-session-delete'
New-Item -ItemType Directory -Path (Split-Path $dest) -Force | Out-Null
Copy-Item '<本目录>' $dest -Recurse -Force
Remove-Item "$dest\.git" -Recurse -Force -ErrorAction SilentlyContinue
也可用目录链接便于改源码即时生效;部分 Windows 环境在该位置创建链接会 Access denied,遇阻则改回复制,改代码后需重新复制再重启。
2、登记 dependencies 与 bundle¶
编辑 <DSH_HOME>\profiles\web\package.json:
{
"dependencies": {
"@mcf171/dsh-session-delete": "link:<本目录的绝对路径>"
},
"dsh": {
"profile": {
"bundles": [
"@mcf171/dsh-session-delete"
]
}
}
}
bundle-patch 型插件只登记 bundles;不要在 profile 的 cordis.patch.yml 里再写同名 insert 行,否则可能重复注册导致插件树加载失败。
3、重启 DSH¶
host 插件仅在启动时加载,改完须重启。
运行环境:package.json 要求 Node ^22.19.0 || >=24.0.0,peer 依赖 @deepseek-ai/cordis ^4.0.1。
典型用法¶
- 重启 DSH 后打开 Web GUI(根路径无 token 会 401,启动日志中有
?token=…,验证时需带 token)。 - 在侧边栏选中要清理的会话;若该会话正在跑回合,先停止再删。
- 打开该行
⋯菜单点「删除会话」,或焦点不在输入框时按Delete。 - 在确认框中确认;成功后该行从侧边栏消失,对应日志目录被删除。
卸载:从 dsh.profile.bundles 移除 @mcf171/dsh-session-delete,并删除 node_modules\@mcf171\dsh-session-delete。
适用场景与注意¶
适合:需要在 Web GUI 里彻底去掉试验会话、误建 fork、或释放 <DSH_HOME>/sessions 磁盘占用的 DSH 用户;希望与官方 archive / 持久化规则一致、且 UI 随官方插槽演进而非 DOM 注入。
注意:
pnpm install或插件市场重装可能清掉 profile 内手动拷贝的包(不在 lockfile 解析结果里);升级 DSH 后也应确认菜单里仍有「删除会话」,没有则重做安装第 1、2 步。- 插件只删日志目录;workspace 归属里可能留下已删会话 id,README 说明为无害残留。
- 怀疑 DSH 升级后路径规则变化时,可在插件目录运行自测:
node test/format-check.mjs
node test/client-check.mjs
结尾¶
@mcf171/dsh-session-delete 用官方归档 + 删日志 + api-session/removed 三步,补上 0.2.x Web GUI 缺失的永久删除入口,并约束运行中会话与误触场景。需要细节时查 SkillHub 目录页与 GitHub README。
- https://www.skillhub.cn/plugins/mcf171/dsh-session-delete
- https://github.com/mcf171/dsh-session-delete