dsh-archived-delete
Verifieddsh-archived-delete · v1.0.0 · MIT · Web UI
Permanently delete a DeepSeek Harness conversation (archived ones included) from the session context menu, with verified removal.
Install
dsh plugin add dsh-archived-delete Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Tags
Creators
Readme
dsh-archived-delete
给 DeepSeek Harness 加一个永久删除对话的动作,已归档的对话也能删。
Adds a permanent Delete conversation action to the DSH session context menu, including archived conversations. Local-only: no network, no model calls, no tokens.
DSH 侧边栏原本只有"归档"——归档只是把对话藏起来,聊天记录仍然占着磁盘,内容也还在。这个插件补上真正删掉的那一步。
安装
方式一:插件管理器
设置 → 插件 → 安装,填包名:
dsh-archived-delete
方式二:命令行(在 profile 目录里)
cd ~/.dsh/profiles/desktop
pnpm add dsh-archived-delete
然后把包名加进 package.json 的 dsh.profile.bundles:
"bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-archived-delete"]
装完需要重启 DSH——它是主进程插件,只在启动时加载一次。
使用
在侧边栏任意对话上右键 → 删除对话 → 确认框里点 永久删除。
删除是不可恢复的,确认框会明确说明这一点。
它会删掉什么
| 位置 | 内容 |
|---|---|
~/.dsh/sessions/<项目键>/<会话ID>/ |
聊天记录本体(JSONL) |
archivedSessionIds |
归档集合里的登记 |
pinnedSessionIds |
置顶集合里的登记 |
workspace sessionIds |
工作区的记账 |
~/.dsh/storages/session_projcache/sessions/<id>.json |
投影缓存 |
安全设计
这个插件做的是不可逆操作,所以每条危险路径都做了拦截:
- 只认会话 ID 格式,且拒绝任何路径分隔符——不可能删到会话目录之外
- 正在运行的对话不让删:先问所有活动提供者(回合、子代理、后台任务、定时任务)。探测本身失败也拒绝——宁可删不掉,也不误删
- 路径越界检查:目标路径必须落在 sessions 根目录内(Windows 下大小写不敏感)
- 删完回头确认:只有目录确实消失才返回成功,不会出现"报告已删、文件还在"
- 读盘错误一律中止:不会把"读不到"降级成"只清索引、假装删了"
- 并发保护:同一会话被两个窗口同时删,只执行一次
- 已经开着的对话:先关闭以释放文件句柄再删;若之后删文件失败,错误信息会明确告诉你"该对话已从运行时关闭"
- 记录已不存在:只清理索引,并在返回值里标记
alreadyAbsent,不会谎报删除成功
它不做什么
- 不联网,不发任何请求,不调用模型,不消耗 token
- 不进回收站——是真删,删了不能恢复
- 不碰其它对话,不读对话内容
卸载
cd ~/.dsh/profiles/desktop
pnpm remove dsh-archived-delete
从 dsh.profile.bundles 里移除同名条目,重启 DSH。已经删掉的对话不会因为卸载而恢复。
兼容性
- Node.js >= 22
- 目标环境:DSH Web GUI
- 主要在 Windows 上验证;macOS / Linux 走同一套路径逻辑
项目结构
lib/index.js 主进程插件:RPC 路由 + purgeSession 删除逻辑
client/client.js 浏览器插件:菜单项 + 确认弹窗
cordis.patch.yml 插件挂载声明
locale/*.json 插件列表里的标题与描述
icon.svg 图标
开发
# 改完之后验证语法与加载
node -e "import('./lib/index.js').then(m => console.log(Object.keys(m)))"
purgeSession(ctx, { sessionId }) 是导出的纯函数入口,可以用假的 ctx 单独测试各条分支。
发布(维护者)
pnpm pack # 先看包里到底装了什么
npm publish --access public
许可证
MIT