因为不小心归档了一个对话,我花了百万token,于是,我做了一个能够反悔的插件。(Deepseek Harness)
·
因为不小心归档了一个对话,我花了百万token,于是,我做了一个能够反悔的插件。
开源插件,MIT 协议
- npm:dsh-unarchive
- GitHub:uwu9039/dsh-unarchive
- 安装:
dsh plugin --profile web add dsh-unarchive

背景
DeepSeek Harness(DSH)的侧边栏里,会话右键菜单提供「归档会话」功能,用于从列表里移除暂时不用的会话。但这个操作是单向的:
- 归档后,会话会从所有列表表面消失(分组列表、平铺列表、搜索都不再出现);
- 如果归档的是当前会话,选中状态也会被清掉;
- 原生代码里只有
archiveSession,没有对应的恢复接口。
换句话说,归档本身不删除任何数据——会话日志、工作区归属都保留,只是把 id 放进了一个全局集合。问题在于:没有 UI 能把 id 从这个集合里移除。误归档之后,只能手工编辑持久化 JSON 找回。
所以写了这个插件:dsh-unarchive(归档会话回收站),补上「查看已归档会话、恢复」这个缺失的环节。
功能
安装后右下角出现一个悬浮按钮,点开是归档列表面板:

- 归档列表:按工作区分组,组内按创建时间倒序,顶部显示总数;
- 内容预览:行内展开第一条用户消息、最近 1–2 条消息、消息/工具统计和最后活动时间;只提取
text文本块、单条不超过 200 字符,不展示工具参数与附件; - 单个恢复:点击后会话回到原工作区原位置,侧边栏即时刷新,不刷新页面,多标签页同步;
- 全部恢复:列表至少两条时可用,面板内二次确认,逐个执行,失败项不整体回滚;
- 归档二次确认:默认关闭。开启后,从右键菜单归档前会弹确认框,显示会话标题与「可恢复」说明,Esc / 遮罩 / 取消均可中止。
设置项在面板的「设置」页:

安装
已发布到 npm:
dsh plugin --profile web add dsh-unarchive
也可以从 GitHub Release 下载 tarball 安装,或本地 npm pack 后安装生成的 tgz。
实现简述
- 宿主端(
src/index.js):恢复、列表、预览、标题、设置共 6 个 HTTP API(同源/dsh-unarchive/api/*)。恢复走workspaceRegistry.enqueueOperation → requireState → sessionKnown 校验 → setState,与原生archiveSession同一串行化队列,幂等且存在性校验; - 客户端(
src/client.js):纯 DOM 实现,不依赖框架和槽位,悬浮按钮、面板、确认弹窗手写,跟随系统浅色/深色主题; - 数据同步:恢复后经原生
host/archived-sessions-changed事件推送,侧边栏即时回到原位置,多标签页同步; - 卸载即复原:归档确认的包装随插件卸载自动还原。

边界
- 只做「查看 + 恢复」,不做删除/清空归档、不做归档内容搜索;
- 不兼容
headlessUI; - 任一依赖缺失时对应功能降级,不阻塞原生归档(fail-open);
- 卸载后仅残留一个设置文件
~/.dsh/unarchive/settings.json。
链接
- GitHub:https://github.com/uwu9039/dsh-unarchive
- npm:https://www.npmjs.com/package/dsh-unarchive
- Release:https://github.com/uwu9039/dsh-unarchive/releases
如有问题或建议,欢迎在 GitHub 提 Issue。
文中插图为本地 Stable Diffusion 生成,插件界面为真实截图。
更多推荐

所有评论(0)