← 返回列表
未验证
为 dsh Web GUI…
尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/9/14 · 已提供中文文档
dsh 插件:从磁盘清除会话历史(工作区/全部/会话),支持限定范围、确认后删除
综合分
29.7
GitHub 分
29.7
用户评分
—
★ Stars
0
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add n0pe-sled/clear-session-history该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/16(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-typert-protocol@deepseek-ai/dsh-typert-registry用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动
README
dsh-clear-session-history
为 dsh Web GUI 添加破坏性的“清除会话历史”功能,每项操作前都有一个“确定吗?”对话框,准确显示将要删除的内容:
1. 清除会话历史。 侧边栏中某个工作区自己的“…”菜单内的一行红色选项(位于重命名 / 删除工作区旁边)。删除该工作区在磁盘上存储的所有会话日志,然后将该工作区本身从侧边栏中移除。
2. 清除所有会话历史。 位于“新建会话”按钮正下方的一个红色按钮。删除所有工作区在磁盘上的所有会话日志,然后将所有工作区从侧边栏中移除(完全重置为空白状态)。
3. 删除会话。 侧边栏中任意会话自己的“…”菜单内的一行红色选项(垃圾桶图标)(位于重命名 / 分叉 / 归档旁边)。从磁盘上删除该会话的日志。工作区及其其他会话不受影响。对已打开(已附加)的会话同样有效:日志被删除,该行立即从侧边栏消失。唯一拒绝的情况是该会话的代理正在运行(有回合正在进行中),因为删除它会破坏正在进行的写入;对话框会说明这一点,并且删除保持禁用状态,直到其完成。
“删除”的含义
会话日志位于 $DSH_HOME/sessions/// 下。该插件通过宿主自身的会话持久化后端删除这些目录(locate() 解析每个会话的目录,不重新实现 slug),因此从磁盘上消失的内容与侧边栏列出的内容完全一致。效果:
- 完全成功清除后,GUI 会重新加载页面,这会关闭确认对话框并重新拉取两个列表:已删除的会话和已移除的工作区一步就从侧边栏消失。(该框架没有“会话已删除”推送事件,因此重新加载是第三方插件反映此更改的可靠方式;这与最初确认删除时手动重新加载的结果相同。)
- 之后会清理空的项目目录。
- 被清除的工作区会从注册表中移除($DSH_HOME/storages/workspace.json),因此其行会从侧边栏消失。全部清除会移除所有工作区注册。任何仍属于已移除工作区的正在运行的会话会移动到“未分组”桶中,与应用自身的“删除工作区”行为一致。
- 部分清除(某些日志无法解析为安全目录)会保留工作区,因此剩余的会话仍保持分组,而不会成为孤儿;对话框会报告有多少已删除、多少未删除。
- 对于保留的工作区,注册表中存储的会话 ID 可能会在下一次宿主启动前过期。无害:侧边栏会针对 session.list 联接成员关系,并跳过没有摘要的 ID。
该插件在构造上不依赖主目录:它从不自行解析路径(没有 ~/.dsh 字面量,没有主目录查找),它触及的每个路径都来自
其接线由 $DSH_HOME 派生的宿主服务(dshHomePath('sessions'))。
已针对使用自定义 DSH_HOME 启动的测试框架进行验证:预览读取该 home 的会话,清除操作将其删除,而默认 home 保持未受影响。
有意保留的内容
每个操作都遵循同一条规则:
- 任何清除操作唯一拒绝的会话是那些其 agent 正在运行的会话(有回合正在进行且日志正在被追加),以及其谱系可追溯到正在运行会话的冷子代理日志(对 parentSession 链求不动点):删除其写入者下方的日志会留下一个重新创建的、无头文件。对话框会报告保留的数量。
- 已附加但空闲(打开)的会话会被删除。宿主会在本次运行的剩余时间内将其接触过的每个会话保留在内存中,因此保护已附加会话会使工作区和全部清除操作在重启前变成空操作。由于宿主仍会从内存中列出此类会话(重新加载后它会残留在侧边栏中),清除操作会先将其归档——宿主自身的归档会隐藏该行,并在它是当前会话时清除选择——然后删除日志。
- 持久化后端无法解析为形状良好的会话目录的任何内容(基名必须等于会话 id,父级必须匹配项目键的形状)。此类条目会被计为未解析并报告回来,而不是被删除。
对话框会在用户确认之前说明保留的数量。
它如何融入 GUI
这三个界面都没有声明插件槽位。工作区和会话行菜单属于 ui-workspace 的浏览器,而 New Session 按钮属于侧边栏外壳,因此浏览器这一半在 DOM 层面进行集成:
- 一个 body 级观察者在 portal 菜单打开时通过其菜单项集合识别它:Rename + Delete-workspace 这一对是工作区菜单(会克隆进来一个“Clear session history”危险行),Rename + Fork + Archive 这一组是会话菜单(会克隆进来一个带垃圾桶图标的红色“Delete session”行)。克隆的行复用菜单自身的类以及主题的危险色。
- 目标在 pointerdown/keydown 时从锚点按钮的 aria-label 中捕获:工作区行(标题 + 同名行中的出现次序,因此同名基名的工作区可以确定性地解析)或会话行(标题、所属工作区分组,以及该行在组内的索引)。会话 id 永远不会到达 DOM,因此插件在点击时通过按组相对行索引寻址 workspace.sessionIds 来解析它,镜像侧边栏自身的渲染顺序(跳过已归档和无摘要的 id),并在执行操作前再次核对会话标题。未分组的行按标题在没有任何工作区拥有的会话中匹配。
- New Session 按钮会在其下方获得一个克隆的红色同级按钮(仅限宽侧边栏;56px 的窄栏保持不变)。
每个钩子在模板不匹配(未知区域设置、DOM 重构)时都会降级为空操作,而不是破坏侧边栏。两个随附的区域设置
(英文和简体中文)已匹配。
该对话框是 harness 自有的 RiskConfirmation 原语(由复选框控制),
托管在插件的私有 React root 上。所有调用都通过
Typert remote(/api/clearSessionHistory/*)往返:
- preview(input) / clear(input) → 工作区范围
{ workspaceTitle, titleOccurrence }(空标题 = 所有工作区);
返回 { targets, kept } / { deleted, targets, kept, removed }。
- previewSession(input) / clearSession(input) → 单个会话
{ sessionId };preview 报告该日志是否可删除,clear
返回 { deleted, targets, kept, removed },并且绝不会移除工作区。
工作区标题通过 workspaceRegistry(注册表显示顺序)解析,
与侧边栏渲染它们的顺序一致。
安装
dsh plugin --profile web add /path/to/deepseek-harness-plugins/clear-session-history
重启 GUI。验证:
curl -s -o /dev/null -w "%{http_code}\n" \
http://127.0.0.1:3080/plugins/dsh-clear-session-history/client.js # 200
安全说明
- 该插件运行在宿主仅追加持久化服务之下。
它只会移除后端自身为所列会话定位到的目录,
并且仅在重新检查磁盘上的目录形态之后才会这样做。
- 工作区注册只会由宿主自身的
workspaceRegistry.delete() 移除,并且仅在完全成功清除(每个
目标日志都已消失)之后才会这样做,因此部分失败绝不会使会话成为孤儿。
- 没有回收站或撤销:删除是永久性的。对话框中的复选框
正是为此而存在。
验证
- pnpm test(node 部分针对打桩服务 + 临时会话根目录):
范围匹配、运行中/子代理保留规则、出现次数解析、未知
工作区软失败、工作区注册移除(按工作区和
全部清除)、部分清除保留工作区、单会话删除
(冷删除、已附加但空闲的删除并归档以隐藏、运行中的
agent 被拒绝、未知 id 失败、工作区绝不删除)、退化
locate() 拒绝、缺失服务失败。
- node tests/client-session-flow.mjs(在 harness
checkout 的 jsdom 下构建的客户端 bundle):针对模拟的分组侧边栏驱动真实的
pointerdown → session-menu → Delete
session → id-resolution 路径,并断言
对话框作用于解析出的会话 id。
- 针对运行中实例的实时探测(非破坏性):
curl -s -X POST http://127.0.0.1:3080/api/clearSessionHistory/preview \
-H 'content-type: application/json' \
-d '{"type":"client-request","rpcId":"probe","method":"clearSessionHistory/preview",
"payload":{"args":{"input":{"workspaceTitle":"","titleOccurrence":0}}}}'
返回的 targets 数量与 find ~/.dsh/sessions -mindepth 2
-maxdepth 2 -type d | wc -l 匹配(减去当时其 agent 正在运行的
会话,这些会话报告为 kept)。扫码进群