在侧边栏一键永久删除会话,清理磁盘数据
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yuzuriwalnori/dsh-session-deleter该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · desktop
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 13 处,展示前 13 条)
- 读取本地文件lib/index.js:79
if (existsSync(cache)) found.push({ kind: 'cache', path: cache }) - 读取本地文件lib/index.js:82
if (existsSync(extra)) found.push({ kind: 'extra', path: extra }) - 读取本地文件lib/index.js:166
if (!existsSync(cwd)) continue - 读取本地文件lib/index.js:274
`找不到该会话的本地文件(home=${home};sessions 目录${existsSync(sessionsRoot) ? '存在' : '不存在'};` + - 读取本地文件lib/index.js:352
sessionsRootExists: existsSync(sessionsRoot), - 发起网络请求lib/client.js:115
res = await fetch(url, { - 读取本地文件install.mjs:75
if (existsSync(join(root, entry.name, 'cordis.patch.yml'))) names.push(entry.name) - 读取本地文件install.mjs:102
const eol = existsSync(patchPath) && (await fs.readFile(patchPath, 'utf8')).includes('\r\n') ? '\r\n' : '\n' - 读取本地文件install.mjs:103
let text = existsSync(patchPath) ? await fs.readFile(patchPath, 'utf8') : '' - 读取本地文件install.mjs:131
if (!existsSync(join(home, 'profiles'))) { - 读取本地文件install.mjs:172
const hadTarget = existsSync(target) - 读取本地文件uninstall.mjs:48
if (entry.isDirectory() && existsSync(join(root, entry.name, 'cordis.patch.yml'))) names.push(entry.name) - 读取本地文件uninstall.mjs:86
if (existsSync(patchPath)) {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 会话删除插件:侧边栏一键永久删除会话,支持强制删除运行中的会话、回收站为空时自愈工作区索引
README
由 DeepSeek 最新模型翻译生成dsh-session-deleter
DeepSeek Harness 会话删除插件 · https://github.com/yuzuriwalnori/dsh-session-deleter
给 DeepSeek Harness 补上官方缺失的「删除会话」:侧边栏每个会话行悬停时多一个垃圾桶按钮,确认后把会话从磁盘上真删掉。
它做了什么
点击按钮 → 弹出确认框 → 确认后 Host 半侧按这个顺序执行:
1. 删文件:直接 rm -rf,不进回收站
- sessions/<项目>/<会话ID>/(会话日志,v0–v4 各代际一起走)
- storages/session_projcache/sessions/<会话ID>.json(标题/轮次等投影缓存)
- attachments/、jobs/、checkpoints/、cache/spill/ 等目录下的同名子目录(存在才删)
2. 改索引(实时生效):
- workspaceRegistry 里 detachSession(id),会话从侧边栏消失
- 若在归档集合里,unarchiveSession(id)
- 若在置顶集合里,unpinSession(id)
删除是不可撤销的:DSH 没有回收站,Windows 回收站也不接管这类目录删除。
展开完整文档(README 剩余 1 节)
dsh-session-deleter
DeepSeek Harness 会话删除插件 · https://github.com/yuzuriwalnori/dsh-session-deleter
给 DeepSeek Harness 补上官方缺失的「删除会话」:侧边栏每个会话行悬停时多一个垃圾桶按钮,确认后把会话从磁盘上真删掉。
它做了什么
点击按钮 → 弹出确认框 → 确认后 Host 半侧按这个顺序执行:
1. 删文件:直接 rm -rf,不进回收站
- sessions/<项目>/<会话ID>/(会话日志,v0–v4 各代际一起走)
- storages/session_projcache/sessions/<会话ID>.json(标题/轮次等投影缓存)
- attachments/、jobs/、checkpoints/、cache/spill/ 等目录下的同名子目录(存在才删)
2. 改索引(实时生效):
- workspaceRegistry 里 detachSession(id),会话从侧边栏消失
- 若在归档集合里,unarchiveSession(id)
- 若在置顶集合里,unpinSession(id)
删除是不可撤销的:DSH 没有回收站,Windows 回收站也不接管这类目录删除。
安全边界
- 确认框明确写「不可撤销」,按钮文案是「永久删除」,避免误触。
- 拒绝删除正在打开的会话——先切到别的会话再删,避免把运行中的会话从脚下抽走。
- 只接受本机回环请求,且必须带 x-dsh-session-deleter: 1 请求头,跨源 POST 直接 403。
- 会话 ID 白名单校验(^session-[A-Za-z0-9_-]{6,}$),防止路径穿越。
- 只动 <DSH_HOME> 内的会话数据;不碰凭据、插件配置、模型设置。
- 删文件失败会报错并说明已删了几项;索引更新失败只给 warning(重启后列表会自行剔除无日志的会话),不会假装回滚。
安装
node install.mjs # 默认装到 ~/.dsh,profile=desktop
node install.mjs --home "D:\\dsh-data" --profile desktop
node install.mjs --copy # 建不了链接时直接复制进 node_modules
安装脚本做三件事:复制包到 <DSH_HOME>/plugins/dsh-session-deleter;在 profiles/<profile>/node_modules 下建目录链接;往 profiles/<profile>/cordis.patch.yml 追加一段带标记的条目。
不写死路径:插件运行时按 $DSH_HOME → ~/.dsh 自己解析数据目录,cordis.patch.yml 里只写 id 和包名。只有非常规布局(比如数据目录和 home 不一致)才需要 --pin-home 把绝对路径写进配置。
装完完全退出 DSH 再启动(托盘退出,不是关窗口)。Host 半侧的代码在主进程里,改完必须重启才生效。
作为 bundle 安装(npm / 插件市场)
包内自带 cordis.patch.yml,package.json 里声明了:
"dsh": {
"bundle": { "patch": "./cordis.patch.yml" },
"client": { "platform": "web" }
}
把它发布出去后,别人在 DSH 的 插件 页面里安装即可,不需要跑任何脚本:
npm publish # 首次发布(先在 package.json 里改 name/仓库地址)
dsh plugin --profile desktop add dsh-session-deleter
从本仓库安装:
dsh plugin --profile desktop add https://github.com/yuzuriwalnori/dsh-session-deleter
如果要发布到 npm,注意两点:
1. 若 npm 上 dsh-session-deleter 已被占用,改成带前缀的包名(如 @you/dsh-session-deleter),同时更新 cordis.patch.yml 里的 name: —— 那一行的名字必须和包名一致;
2. package.json 里的 repository / dsh.install 地址要跟着仓库走。
两种安装方式不要混用
| | bundle(插件市场 / pnpm) | 离线(install.mjs) |
| 插件从哪来 | pnpm 装到 profiles/desktop/node_modules | 复制到 <DSH_HOME>/plugins/ 再链接 |
| 谁注册 loader 条目 | 包内 cordis.patch.yml | profile 的 cordis.patch.yml |
| 需要 node/pnpm | 需要(DSH 自带) | 只需要 node 跑一次脚本 |
两条路径都会注册同一条 loader 条目(id 都是 dsh-session-deleter),混用会重复注册。install.mjs 现在会先读 profile 的 package.json:如果 dsh.profile.bundles 已经选中本包,就直接退出、不写补丁;只有没选中时才走手工安装。
在其他电脑上安装(离线)
1. 解压 dsh-session-deleter-<版本>.zip 到任意目录;
2. 目标机装过 DSH 并至少启动过一次(这样 ~/.dsh/profiles/desktop 才存在);
3. 在解压目录执行 node install.mjs;
4. 完全退出 DSH,重新启动。
脚本会自己找 ~/.dsh(或 $DSH_HOME)和 profile,不需要 pnpm、不需要联网,Windows / macOS / Linux 同一套。
目标机没有 Node? 手工装也一样:
1. 把整个 dsh-session-deleter 目录复制到 <DSH_HOME>/plugins/dsh-session-deleter
2. 在 <DSH_HOME>/profiles/desktop/cordis.patch.yml 末尾追加:
- insert:
- id: dsh-session-deleter
name: 'dsh-session-deleter'
3. 把该目录链接或复制到 <DSH_HOME>/profiles/desktop/node_modules/dsh-session-deleter
4. 重启 DSH
<DSH_HOME> 在 Windows 是 %USERPROFILE%\.dsh,macOS / Linux 是 ~/.dsh。
版本兼容
- 只依赖 Node 内置模块,engines: node >= 18。
- 工作区服务按 workspaceRegistry → workspaces 两个名字依次尝试;槽位 sidebar.workspaces.session.row.action / shell.overlay 不存在时插件只是不显示按钮,不会报错。
- 会话存储按 sessions/<项目>/<会话ID>/session.jsonl 扫描,不绑定具体格式代际(v0–v4 都认)。
卸载
node uninstall.mjs # 移除链接与 patch 条目,保留源码
node uninstall.mjs --purge # 连源码目录一起删
作为 bundle 安装的,用插件市场卸载,或 dsh plugin --profile desktop remove dsh-session-deleter;不要再用 uninstall.mjs(它只管离线安装那一套)。
批量删除
用同工作区的 WorkBuddy 技能 dsh-session-cleaner,默认同样是真删:
python dsh_sessions.py delete --older-than 30d # 干跑
python dsh_sessions.py delete --older-than 30d --apply # 永久删除
python dsh_sessions.py delete --older-than 30d --apply --trash # 想留退路时才用
插件版面向单条随手点,技能版面向批量;两者的删除语义一致。
实现要点(给后来改代码的人)
- 客户端插件是手写的 window.__ModuleLoader__.load({id, factory}),id 必须等于包名;factory(require) 里 require('react') 来自平台种子表,无需打包。
- 槽位:
- sidebar.workspaces.session.row.action(kind: list)——行内按钮,官方 archive=100、pin=200,本插件用 300。
- shell.overlay —— 确认对话框,自己画遮罩,position: fixed。
- 槽位属性由槽位本身注入:{ sessionId, displayTitle }。
- ctx.slots.inject(name, cb) 会等到槽位就绪再注册,插件不必关心加载顺序。
- Host 半侧是一条 webServer.register({ kind: 'exact', path }) 路由;客户端优先用当前 http(s) origin,桌面端 origin 是 app:// 时回退到 http://127.0.0.1:43120。
- 索引改动走官方 ctx.get('workspaceRegistry') 服务,所以侧边栏实时更新;这也是为什么删除前要拒绝「正在打开的会话」。
- 没有导入任何 @deepseek-ai/* 包:profile 的 node_modules 里解析不到它们,插件只依赖 node 内置模块。
删除正在运行 / 正在打开的会话
默认会挡住:
该会话正在打开或运行中。要用「强制删除」才能继续
点确认后如果命中这条,对话框原地多出一个「强制删除」按钮(红色),再点一次才真删。强制路径做的事:
1. 先调官方 workspaceRegistry.archiveSession(id, { stopActivity: true }),让宿主停掉这个会话正在跑的任务(这是官方提供的停机入口,归档只是顺带结果);
2. 再删文件;
3. 最后 detachSession 并把临时归档撤掉。
注意:即使文件删掉了,那个会话的 Session 对象可能还在宿主内存里,界面刷新或重启后才会彻底消失;如果它恰好在写日志,可能把文件重新建出来。所以强制删完建议刷新一次页面,发现残影就重启 DSH。
工作区注册表为空时自愈
如果 workspace.json 的 workspaces 表被清空(例如异常退出后),应用启动时会因为 initialized 已为 true 而跳过 bootstrap,于是永远自愈不了:侧边栏没有工作区分组,删除会话也没有条目可摘,只能整页刷新。
插件 1.3.0 起会在启动后 4 秒检查一次:注册表为空且磁盘上有会话时,用官方 workspaceRegistry.create() + attachSession() 按 cwd 重建工作区并挂回会话。已有工作区时是空操作。要关掉就加 config: { autoHeal: false }。
也可以在 DSH 完全退出后离线修:
node tools/repair-workspace.mjs --dry-run # 先看会写什么
node tools/repair-workspace.mjs # 备份后写入
node tools/repair-workspace.mjs --wait 300 # 等它退出(最多 5 分钟)
离线脚本会沿用 defaultWorkspaceId 作为重建后工作区的 ID,并按最后活动时间倒序恢复会话顺序。
故障排查
报「找不到该会话的本地文件」,左边会话却没消失
这通常是残留行(ghost):那一行的文件在更早的一次删除里已经删掉了,但你看到的列表还是旧快照。点第二次自然找不到文件。
插件 1.2.0 起已处理这个场景:删除成功后,如果宿主没有可摘除的工作区条目(workspaceRegistry 为空或取不到),界面会显示「已永久删除。正在刷新列表…」并自动重载页面,重建列表。
想确认宿主到底看到了什么
curl http://127.0.0.1:<端口>/dsh-session-deleter/state
返回 home、sessionsRootExists、projects、sessionDirs(磁盘上的会话数)、workspaces(注册表里的工作区数)。端口用 Get-NetTCPConnection -State Listen 查 DSH 进程那一条。
改了插件代码不生效
Host 半侧跑在主进程里,Node 的 ESM 模块缓存不会因为文件变化而失效,必须完全退出 DSH 再启动;只关窗口不算。
已知限制
- 一次只能删一个会话(按钮形态);批量删除用 WorkBuddy 技能 dsh-session-cleaner。
- DSH 升级若改了 session.vN 命名或缓存路径,需要复核 locate()。
- 会话正被搜索索引或其他插件持有时,删除后可能短暂出现在搜索结果里,刷新页面即可。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
yuzuriwalnori/dsh-session-deleter
在侧边栏一键永久删除会话,清理磁盘数据
相关插件 · 桌面端
Codex 任务面板chuspeeism/dashi-taskboard
现代化可灵活嵌入的任务面板,支持 Codex、DeepSeek Harness
★ 3,409已汉化DSH
71.7
多智能体自进化开发平台Prism-Shadow/penguin-harness
统一、稳定的 Agent 自进化框架全自动优化:任意模型 · 任意算法 · 任意 Benchmark
★ 3,111已汉化DSH
71.1
桌面宠物PC2005-cloud/dsh-pet
DSH 桌面宠物:一行命令装好即用的透明动画小桌宠,支持多开、大小位置随心配置;还内置 DIY 素材链,能用 AI…
★ 5,341已汉化DSH
71
多端 Agent 工作台GCWing/OpenBitFun
OpenBitFun 是一个高度可定制的开源 Agent 工作台,让任务按你的方式持续推进。
★ 3,449已汉化DSH
70.8
DSH Desktopanywhere-labs/dsh-desktop
为 DeepSeek Harness DSH 插件生态打造的现代化桌面端解决方案。万物皆「插件」,桌面本身也是「插件」。
★ 34,532已汉化DSH
70.7
桌面宠物伴侣OpenPetsHQ/openpets
桌面伴侣平台,带宠物、插件,还能选配本地智能体集成。
★ 1,353已汉化DSH
70.2
这是你的仓库?认领条目