dsh-archive-confirm
给 DSH Web 的「归档会话」(Archive session)补一道二次确认,挡住侧栏行尾图标、右键菜单、快捷键这几处最常见的误触。
关于这个项目:本插件由 AI 生成——需求、方案与验收由使用者提出并把关,实现在 AI 协作下完成。你可以随意使用、修改、再分发,唯一的要求是注明来源(见文末使用与署名)。
为什么需要它
DSH 官方对「归档会话」的处理是:
- 静止的会话:点了就归档,没有任何确认;
- 只有还有工作在跑的会话,才会被 Host 拒绝,并弹出「停止并归档」的确认框(按族列出进行中的回合、子代理、后台任务、定时提醒)。
也就是说,鼠标扫过会话行尾那两个小图标(置顶 / 归档)时手一抖,会话就当场从侧栏消失了。归档本身不删数据、还能在「已归档会话」里恢复,但误触之后的寻找与恢复成本并不低。
本插件只补这一件事:归档之前问一句。
它做什么
- 拦截
uiWorkspace.archiveSession(sessionId),先弹确认框,点「归档」才真正归档,点「取消」什么都不会发生。 - 官方侧栏的行尾图标、右键菜单项、
Mod+Shift+A快捷键都汇到这一个服务方法,所以一处拦截即可覆盖全部入口;第三方侧栏插件只要仍走同一方法也自动生效。 - 带
stopActivity: true的调用直接透传——那是官方「停止并归档」对话框确认后的第二次调用,不会连环弹框。 - 归档成功后仍由官方给出 toast 与「撤销」,本插件不介入归档结果,也不改变任何归档语义。
它不做什么
- 不改 DSH 本体(
resources/app.asar一个字节都不动),不碰会话数据、不碰归档集合。 - 不拦
dsh-tree-view的「收进树 / 收起其他分支」(走 Host 注册表,本身自带确认)。 - 不拦脚本或自动化里的宿主侧归档。
界面
弹窗复用官方 Modal / Button 组件,外观与官方「停止并归档」一致:
- 标题:
归档这个会话? - 说明:
它会从侧栏移除,之后可以在「设置 → 已归档会话」里恢复。归档不会删除任何聊天记录。 - 按钮:
取消(默认焦点)/归档;Esc关闭等同取消。
运行中的会话会连续遇到两次确认:本插件的「归档?」+ 官方的「停止并归档」(后者列出正在跑的工作,信息更全)。这是有意为之——第二次确认包含你真正需要的决策信息。
降级与安全边界
插件可能失效,但不允许它把归档卡住或弄坏界面:
| 情况 | 行为 |
|---|---|
拿不到 uiWorkspace 服务 |
记一条警告,不拦截,归档照旧 |
| 服务方法不可写(实例与原型都试过) | 记一条警告,不拦截,归档照旧 |
| 弹窗挂载/渲染失败 | 记一条警告,按原行为直接归档 |
| 弹窗 30 秒没有结果 | 按「取消」收口,并记一条警告 |
平台模块(react 等)缺失 |
退化为自绘弹窗;再缺则按原行为直接归档 |
用户取消时抛出的拒绝带 ArchiveCancelledError 标记:官方调用方只记一条 console.warn,既不会弹错误提示,也不会误报「已归档」。
安装
要求:DSH Web / 桌面版(本插件在 0.2.2-rc.1 实测),profile 为 desktop 或 web 均可。
方式一:插件界面安装(推荐)
把本仓库克隆到本地任意目录,然后在「设置 → 插件」里安装该本地目录;或在设置里启用后重启 DeepSeek Harness。
方式二:命令行安装
git clone https://github.com/jiayaoting/dsh-archive-confirm.git
dsh plugin --profile desktop add link:<克隆下来的绝对路径>
方式三:手动挂载(无需 pnpm)
把整个目录复制到
~/.dsh/local-plugins/dsh-archive-confirm(Windows:C:\Users\<你>\.dsh\local-plugins\dsh-archive-confirm)。在
~/.dsh/profiles/<profile>/package.json里加两处:{ "dependencies": { "dsh-archive-confirm": "file:<插件目录的绝对路径>" }, "dsh": { "profile": { "bundles": [ "@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-archive-confirm" ] } } }在
~/.dsh/profiles/<profile>/node_modules里建一个指向插件目录的链接(Windows 可用mklink /J)。重启 DeepSeek Harness(客户端插件在页面启动时加载,热更新不会加载新条目)。
验证是否生效
打开 DevTools Console,应能看到:
[dsh-archive-confirm] 已启用:归档会话前会二次确认或执行
window.__dshArchiveConfirm,应返回{ version: '0.1.0', patched: true }。鼠标划过侧栏任一会话 → 点行尾归档图标 → 应弹出「归档这个会话?」。
点「取消」→ 会话原地不动;点「归档」→ 正常归档,出现官方 toast 与「撤销」。
右键菜单、
Mod+Shift+A各试一次。
卸载 / 回滚
- 首选:在「设置 → 插件」里停用本插件,重启后即恢复官方原行为。
- 彻底移除:从 profile 的
package.json删掉上面那两处登记,删掉node_modules里的链接与插件目录,重启。 - 若插件导致启动异常:把
package.json恢复成安装前的备份,删掉链接,重启。
兼容性与已知限制
- 依赖
@deepseek-ai/dsh-client-ui-workspace暴露的uiWorkspace.archiveSession。这是一个非官方公开扩展点的包装:若上游改签名或改为不可写,插件会按上表降级为「不拦截」,不会阻断归档。 - 文案目前按
navigator.language在中文 / 英文之间二选一,未接入 DSH 的语言设置。 - 运行中的会话会有两次确认(见上文,属预期)。
- 若将来官方给静止会话也加了确认,会出现两层确认框——届时停用本插件即可。
实现要点(给维护者)
- 为什么拦在服务层而不是按钮上:官方 UI 的三个入口(行内图标、菜单项、快捷键)最终都调用同一个
uiWorkspace.archiveSession,拦服务一处即全覆盖,也不用去抢 slot 里官方已注册的条目。 - 怎么包装:优先给实例赋同名属性(影子方法),失败则退到原型上改;两者都不可写时放弃拦截。所有降级路径都只记警告。
- 为什么取消用拒绝而不是静默 resolve:官方调用方在
archiveSession成功后会给「已归档」toast 和「撤销」按钮;取消若 resolve,会误报一条归档成功。拒绝则只留下一条 console 警告。 - 为什么带
stopActivity就透传:那是官方确认对话框的回调,重复询问只会让人多点一次。
使用与署名
- 生成方式:本插件由 AI 生成(用户提出需求并审阅方案,AI 完成实现、测试与文档)。
- 使用条件:可自由使用、修改、再分发,无需授权、无需付费;唯一要求是注明来源——在衍生项目的 README、发布说明或关于页面里给出本仓库地址即可。
- 不提供担保:按「现状」提供,因误用或上游接口变更造成的任何损失由使用者自行承担。
- 许可证:MIT,见 LICENSE。署名要求是本项目在 MIT 之外额外提出的请求,请一并遵守。
源码结构
dsh-archive-confirm/
├─ lib/index.js # 宿主半侧:空壳挂载点,让插件出现在插件列表里可启停
├─ lib/client.js # 浏览器半侧:包装 uiWorkspace.archiveSession + 确认框
├─ cordis.patch.yml # bundle patch:往 profile 的加载树插入一行
├─ test/smoke.mjs # 离线自测:取消/确认/透传/降级/还原五个用例
└─ package.json # dsh.client / dsh.bundle 声明
跑一次自测(会用最小桩件在 Node 里模拟浏览器环境,不需要真正启动 DSH):
npm test
No comments yet. Be the first to write one.