dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Physically delete DeepSeek Harness Sessions with an undoable recycle bin: move a Session log out of its workspace, restore it, or purge it for good.
真正删除 DeepSeek Harness 会话的日志文件,并提供一个可以撤销的回收站。
dsh plugin --profile <profile> add @jingmei2/dsh-session-trash
装完重启应用(Host 半改动需要重启,Client 半刷新页面即可)。也可以在「插件市场」里按包名
@jingmei2/dsh-session-trash 搜索安装。
DSH 本身只支持「归档」:会话行从列表里消失,但 ~/.dsh/sessions 下的日志原样保留。
这个插件把「物理删除」补上,并且删除是可撤销的:
| 操作 | 效果 |
|---|---|
会话行 … 菜单 → 彻底删除… | 会话目录(含子代理会话)移入回收站,会话行从工作区列表隐藏 |
| 设置 → 会话回收站 → 恢复 | 目录移回原位置,会话回到原工作区、原位置 |
| 设置 → 会话回收站 → 批量清理 | 按工作区分组勾选,一次移入回收站多个会话;正在生成回复的会被跳过并列出原因 |
| 设置 → 会话回收站 → 彻底删除 / 清空回收站 | 从磁盘上真正删除,不可恢复 |
「移入回收站」用的是宿主自己的归档通道(workspaceRegistry.archiveSession),不是「从工作区摘除」。
这一点很关键:DSH 不会因为切换会话就释放它,被摘除的会话仍然活在内存里,于是会掉进列表底部的
「未分组」 分组里显示成一条删不掉的行。归档只把会话从默认视图里藏起来,工作区归属原样保留,
所以行会干净地消失,恢复时也直接回到原来的位置。
菜单行直接复用宿主的 MenuItemButton(经模块加载器的基线模块表 require('@deepseek-ai/dsh-client-ui-primitives') 取得),
因此高度、内边距、图标 14px、悬停与键盘行为都和「复制 Session ID」等自带行一致;取不到该模块时退回同语义的
role="menuitem" 按钮。设置页与确认弹窗按 --dsw-alias-* 主题令牌自绘。
running),
移动日志会让它的后续写入落到旧路径,所以插件直接报错而不是硬删。批量清理里这些会话会被跳过,
并在结果里列出原因,其余照常删除。rename 到
~/.dsh/session-trash/<条目>/data/(同一文件系统内是原子的)。任何一步失败都会自动回滚——包括
撤销归档——不会出现「列表没了、文件还在别处」的半成品。~/.dsh/sessions/--<cwd-slug>--/session-<uuid>/ # 原始位置
~/.dsh/session-trash/
20261019-165233-a1b2c3/
meta.json # 会话、工作区、时间、字节数、子会话清单
data/--<cwd-slug>--/session-<uuid>/ # 被移动的日志
卸载插件不会自动清空回收站:~/.dsh/session-trash 需要手动删除。
插件同时注册 session_trash 工具,参数 action:list / trash / restore / purge / empty,
与界面走同一套宿主逻辑。action=trash 可传 sessionIds 数组做批量删除(最多 200 个),
返回逐条结果 { results, trashed, skipped },单个失败不影响其余。
node --test test/*.test.mjs
test/core.test.mjs:文件层逻辑(移动、回滚、恢复、批量、冲突、损坏条目),不依赖 Cordis。test/http.test.mjs:用 stub context 真实调用 apply(),覆盖路由/回环围栏/op 分发/工具 action→op 映射。test/client.test.mjs:stub 模块加载器与 React,验证三个注册项、首次渲染、批量页的过滤。Host 半改动需要重启应用;Client 半改动刷新页面即可。
MIT © magi