- Inicio
- Plugins
- Sesiones y mensajes
- dsh-session-recycler
dsh-session-recycler
zhezhi33/dsh-session-recycler
Two-stage session deletion for DSH on Windows: move a conversation to the recycle bin and restore it to its original sidebar slot; deletion confirmed in two steps to prevent deleting files by mistake, clearing the whole subagent tree, sidebar ledger, projection cache, log lines and exclusive attachments along the way. It also scans the files a conversation actually wrote, adds a file query that pastes the path information into the conversation so an agent can judge which files are safe to delete, highlights them in Explorer, and copies the paths grouped by type. Both this and iamwuzhanglin/dsh-session-recycler install under the package name dsh-session-recycler, so install only one of them.
Instalar
dsh plugin --profile web add github:zhezhi33/dsh-session-recyclerREADME
dsh-session-recycler
English | 中文
DeepSeek Harness 的会话管理插件,只支持 Windows。
它解决两件 DSH 本身不管的事:删对话删不干净,以及说不清一条对话到底改过哪些文件。
- 删除做成两段:先移进插件自己的回收站,随时能搬回侧栏原位置;确认不要了再彻底清, 连带整条子代理树、侧栏账本、投影缓存、日志里相关的行、只被它引用过的附件一起清掉。
- 产物可以反查:右键一条对话,扫出它真正写过的文件,在资源管理器里多选高亮; 也能一键把这条对话的完整路径清单复制到剪贴板,或交给助手判断哪些文件可以删。
功能
1. 两段式删除
| 阶段 | 做什么 | 能恢复吗 |
|---|---|---|
| 移入回收站 | 会话目录整体 rename 进插件回收站(同盘原子操作,不复制);子代理对话跟着主对话一起搬走;侧栏投影缓存行备份后摘除 | 能 |
| 彻底删除 | 删掉回收站里的整条对话链,清侧栏账本(sessionIds / 归档 / 置顶)、投影缓存及其 .bak、日志里提到这些会话的行、cache/ 下同名条目、只被它们引用过的附件对象与 files-v3 登记 | 不能 |
| 恢复 | 目录搬回原工作区绝对路径,投影缓存行写回,会话回到侧栏原来的槽位 | — |
移入回收站时日志、缓存、附件一律不动,只有彻底删除才连带清理。 工作区里的会话被清空后,空掉的工作区注册也会一并注销,侧栏不会留下一个空分组; 恢复时若该工作区已被注销,会按原路径重新建回来,会话仍然回到原位置。
2. 会话管理面板
入口有两个:侧栏底部的「会话管理」,以及会话右键菜单里的「移入回收站」。
- 会话按工作区分组列出,组头可以折叠/展开,折叠时箭头旋转,键盘 Enter / 空格也能切换
- 搜索框按标题或工作区过滤;「全选」作用于当前过滤结果,「全选本组」只作用于那一组
- 每行显示大小、最后活动时间、子代理会话数、工作区路径
- 删除前二次确认,确认框里写明会话数、产物数量与总大小
- 页签「回收站」:同一套搜索 / 全选 / 逐条勾选,行内可逐条「恢复」或「彻底删除」
- 回收站页底部:勾选「同时删除文件产物」后,彻底删除会一并删掉该会话生成的文件, 并可预览清单;旁边是红色「全部删除」,作用于勾选的会话,同样走二次确认
- 两个页签的勾选各自独立,切页即清空,不会把一页的选择带到另一页去删
3. 打开文件目录
右键会话 →「打开文件目录」:
- 扫描整条对话链(主对话 + 它派生的所有子代理),只统计写操作产生的文件
- 按目录聚类,打开文件最集中的那个目录,并把命中的文件多选高亮
- 提示:
已打开目录并高亮 N 个文件;另有 M 个文件在其它目录
右键会话 →「打开所有文件目录」:把散落在所有目录里的产物逐个目录打开并高亮, 不限制目录数。Explorer 操作通过串行队列执行,多个目录不会互相抢焦点。 打开方式可在面板右上角 ⚙ 里查看;标签页自动化已暂停,只用「多个窗口」。
产物识别的口径(只算产出,不算引用):
| 来源 | 算产物 |
|---|---|
write / edit 工具调用的 file_path | ✅ |
命令行里的写入目标:> >> 重定向、Set-Content / Out-File、Copy-Item / Move-Item 的目标、tar -czf 输出 | ✅ |
| 会话期间工作区内被改动过的文件(mtime 兜底) | ✅ |
read / grep / read_image 打开过的文件 | ❌ 视图引用,不算 |
| 只在对话文字里被提到过的路径 | ❌ |
4. 文件查询
右键会话 →「文件查询」:扫描这条对话的全部产物,生成一段分析提示词 (文件清单 + 目录分布 + 期望的输出格式),直接填进对话输入框,回车即可让助手 逐个说明文件用途,并归类为缓存 / 对话记录 / 生成文件 / 引用素材,给出哪些可以删。
输入框拿不到时(比如页面结构变了)自动退到剪贴板,粘贴即可。
5. 文件信息:复制当前所有路径
右键会话 →「文件信息」,或会话行右侧的「文件信息」按钮:扫描后在剪贴板里放一份 按类型分好组的完整路径清单——文件产物 / 缓存 / 工作目录 / 网络素材下载 / 对话记录, 分组内去重、按路径排序。粘到哪里都能直接用:搜索框、脚本、别的对话、文本比对工具。
安装
用安装包(推荐)
- 完全退出 DeepSeek Harness(托盘图标右键退出,只关窗口不算)
- 解压
dsh-session-recycler-<版本>.zip,双击一键安装-纯PowerShell.cmd - 看到「安装完成」后重新打开 DeepSeek Harness,侧栏底部出现「会话管理」即成功
不需要联网,不需要管理员权限,不用自己装 Node 或 npm,只用 Windows 自带的 PowerShell 5.1。
装之前想先确认的话,给 cmd 加参数:
一键安装-纯PowerShell.cmd --check 只检查,不写任何文件
一键安装-纯PowerShell.cmd --dry-run 演练,打印会改什么
一键安装-纯PowerShell.cmd --profile desktop 机器上有多份 profile 时只装指定那份
一键安装-纯PowerShell.cmd --link 用目录链接代替复制(改源码即时生效)
一键安装-纯PowerShell.cmd --home D:\dsh-home 数据目录不在默认位置时指定
安装器只碰两样东西:把插件文件复制进 <profile>\node_modules\dsh-session-recycler\,
以及在 <profile>\package.json 里登记一条依赖和一个 bundle 声明;
改 package.json 之前会备份成 package.json.bak-<时间戳>。
卸载
双击 一键卸载-纯PowerShell.cmd,或:
.\install-dsh-session-recycler-native.ps1 --uninstall
会删掉 node_modules 里那份插件,并撤掉 package.json 里加过的两条登记。
回收站里已删的会话不会被删,它们在 %USERPROFILE%\.dsh\dsh-session-recycler\ 下,要清就手工删。
开发模式
把源码放到 <DSH_HOME>\local-plugins\dsh-session-recycler,在 profile 的 package.json 里登记:
"dependencies": { "dsh-session-recycler": "link:C:/Users/<you>/.dsh/local-plugins/dsh-session-recycler" }
"dsh": { "profile": { "bundles": ["...", "dsh-session-recycler"] } }
link: 是软链,改完重启 DSH 即生效,不用重跑安装。
实现要点
- 会话正文是多帧拼接的 zstd,Node 的 one-shot 解压只吐第一帧。这里按帧魔数
28 B5 2F FD切开逐帧解压,才能拿到完整正文。 - 会话标题在
session/title事件里,不在用户消息字段,后出现的 provider 标题优先于 fallback。 - 删除后侧栏不消失是宿主内存态没清。删之前要跑一遍销户:
agent.cancel({kind:"disposed"})→agent.scope.dispose()→agents.store.delete()→sessions.flush()→entry.detach()→ 兜底ctx.emit("session/disposed", session)。 少了最后一步,会话会被挪进「未分组」而不是消失。 - 工作区是独立实体(
ctx.workspaceRegistry)。detachSession(id)只从sessionIds里过滤掉 id, 工作区注册本身不会因为会话清空而消失,侧栏就会留一个空分组。所以摘完会话后要检查sessionIds是否为空,为空才registry.delete(id);恢复时若注册已不在,按原路径registry.create(path)重建再挂回去。 - 恢复要挂回原槽位:
entity.attachSession(id)是头插,还要insertSessionBefore(id, anchor)才能回到原来的位置,锚点取删除时记下的「它后面那个会话」。 - 产物识别从正文里用正则抽路径片段(不要求整串是路径),再按会话时间扫工作区补漏;
只保留落在
cwd内、真实存在、非node_modules/.git/dist、非工程配置文件、 扩展名不在日志缓存黑名单里的普通文件。 - 资源管理器多选高亮走 Shell COM:
$win.Document.SelectItem($item, 1),连续调用是累加。 文件名不能走命令行参数(中文会被编码吃掉),改成 UTF-8 JSON 文件传;子进程也不能detached, 否则 powershell 被提前结束、窗口根本开不出来。
已知限制
- 只在 Windows 上验证过(依赖
explorer.exe与 Shell COM)。 - 产物识别靠正文里的路径文本加工作区 mtime 兜底,纯命令行
cd之后的相对写入仍可能漏。 - 标签页模式已停用:Windows 资源管理器无法保证自动化焦点安全,误触可能改到文件名。
- 只能安装在 DSH 里,依赖宿主提供的
react与@deepseek-ai/dsh-client-ui-primitives。
许可
MIT
Plugins relacionados
dsh-web-ui (dsh-chat-recovery)
zhu1090093659/dsh-web-ui
billion-context
ranxianglei/billion-context
dsh-synapse
liangmianya/dsh-synapse
dsh-archive-manager
michengai/dsh-archive-manager