因为不小心归档了一个对话,我花了百万token,于是,我做了一个能够反悔的插件。

开源插件,MIT 协议

封面

背景

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 事件推送,侧边栏即时回到原位置,多标签页同步;
  • 卸载即复原:归档确认的包装随插件卸载自动还原。

工作台

边界

  • 只做「查看 + 恢复」,不做删除/清空归档、不做归档内容搜索;
  • 不兼容 headless UI;
  • 任一依赖缺失时对应功能降级,不阻塞原生归档(fail-open);
  • 卸载后仅残留一个设置文件 ~/.dsh/unarchive/settings.json

链接

如有问题或建议,欢迎在 GitHub 提 Issue。


文中插图为本地 Stable Diffusion 生成,插件界面为真实截图。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐