← Back to home@CHYMZXS

dsh-archive-workbench

归档工作台(DeepSeek Harness 插件):在侧边栏会话菜单中永久删除会话,并提供归档会话面板,可一键恢复或删除已归档会话。

Stars
0
Language
JavaScript
Created
Oct 19, 2026
Updated
Oct 21, 2026

Introduction

dsh-archive-workbench

归档工作台 — DeepSeek Harness 的会话删除 + 归档管理插件。

中文 | English

DeepSeek Harness 官方只能归档会话(隐藏,不删盘),也没有一个方便的地方查看已归档的会话。这个插件补上这两块:

  1. 永久删除会话 —— 侧边栏会话行的「...」菜单里多一项「删除会话」,真正删掉磁盘上的日志,而不是只隐藏。
  2. 归档会话面板 —— 侧边栏底部多一个归档图标,点开是一整页已归档会话列表,每行可恢复归档或删除。

截图

归档会话面板 —— 侧边栏的「已归档会话」,每行可恢复归档或删除:

归档会话面板

删除确认弹窗 —— 从会话菜单或面板删除时都会弹出:

删除确认弹窗


功能

1. 会话菜单:删除会话

在任一会话行的「...」菜单最下方(复制 Session ID 之后,带分隔线):

置顶 → 重命名 → 分叉 → 归档 → 复制 Session ID → 删除会话

点击后弹出确认框,确认即永久删除:

  • 删除该会话自己的日志目录(~/.dsh/sessions/<项目>/<会话ID>/)
  • 清理它的投影缓存(~/.dsh/storages/session_projcache/sessions/<会话ID>.json)
  • 把该 id 从归档/置顶集合以及工作区的会话顺序列表里移除(不留下持久化的孤儿 id)
  • 通知前端立即移除该行(无需刷新页面)
  • 如果删掉的正是当前打开的会话,主区域自动回到新会话页,不会卡在一个已删除的会话上

已归档的会话同样支持 —— 菜单项不区分状态。

2. 归档会话面板

侧边栏底部图标栏(与「插件」「定时」并排)多一个归档图标,点开后在主区域显示整页列表:

已归档会话  2
归档的会话会显示在这里,可随时恢复或删除。

┌─────────────────────────────────────────────────────────┐
│ 会话标题                              [恢复归档] [删除]   │
│ session-cf676d08-1890-427e-aa64-34a910d31600            │
│ 工作区:dsh-test                                         │
└─────────────────────────────────────────────────────────┘
  • 每行显示标题 + 原始会话 ID + 所属工作区(取不到标题时显示「未命名会话」)
  • 恢复归档:调官方 unarchiveSession,该行立即消失,会话回到原工作区位置;成功后底部有 aria-live 提示
  • 删除:复用同一个确认框,永久删除
  • 顺序:最近归档的在最上
  • 归档超过 6 条时出现搜索框,可按标题、会话 ID、路径或工作区过滤
  • 首次加载显示「正在加载归档会话…」,不会先闪一行「未命名」
  • 空状态:「还没有归档的会话。」

顺便说明:官方其实也有查看归档会话的入口(侧边栏顶部「视图选项」→ 全部对话(显示已归档)),但入口较深,且那里没有恢复/删除按钮 —— 恢复还得回到会话行的「...」菜单。本面板把这两件事集中到一个地方。


安装

方式一:插件市场(推荐)

在 DeepSeek Harness 里打开 设置 → 插件,搜索 dsh-archive-workbench。

方式二:命令行

dsh plugin add dsh-archive-workbench

方式三:从 GitHub 直接安装

dsh plugin add https://github.com/CHYMZXS/dsh-archive-workbench

方式四:本地开发目录

dsh plugin add /path/to/dsh-archive-workbench

安装后重启一次 DeepSeek Harness(插件含 Host 端代码,首次安装需要重启生效)。


配置

Host 端声明了 Config schema,可在插件设置里调整(都有默认值,不配也能用):

配置项默认值说明
idleTimeoutMs8000删除驻留会话时,等待它空闲的上限(毫秒)
settleAttempts6删完后复查日志是否被重建的次数
settleDelayMs250每次复查之间的间隔(毫秒)
maxBodyBytes4096删除路由接受的请求体上限(字节)
sessionsRoot""自定义会话根目录;留空则用 DSH_HOME/sessions 或 ~/.dsh/sessions

已知限制

正在运行的会话(重要)

DeepSeek Harness 没有任何公开 API 能让一个会话从内存中退出。因此对于本次运行中打开过、还驻留在内存里的会话,删除文件不够 —— 它可能立刻把日志重新写回来。

插件的处理方式是:

  1. 先调用官方 archiveSession({ stopActivity: true }),停掉它正在跑的工作并封住后续写入
  2. 等它空闲(最多 idleTimeoutMs)
  3. 再删文件
  4. 删完反复复查(最多 settleAttempts 次)确认文件没有重新出现

如果文件仍然被重建,插件会明确报错并且把归档状态回滚(不会留下一个"删失败却被归档了"的会话):

the session is still resident in this application and keeps recreating its log; restart the application and delete it again

建议:如果要删的是"当前正在用/刚用过"的会话,先重启一次应用再删 —— 重启后它变成冷会话,删除是干净的。

找不到日志目录

如果会话在存储里存在、但在当前会话根目录下找不到对应文件夹,插件返回 409 并提示检查 DSH_HOME 或 sessionsRoot,而不是假装删成功。反过来,如果存储里和磁盘上都已经没有这个会话,重复删除是幂等成功(alreadyGone: true),方便脚本重试。

附件不会被删除

~/.dsh/attachments/ 里的图片/附件不会被删除。它们按内容哈希全局共享,多个会话可能引用同一个对象 —— 按会话去删会破坏其他会话。也正因如此,删一个会话回收的空间通常远小于它在附件目录里的占用。

子智能体会话

子智能体(subagent)产生的会话不会出现在侧边栏,因此无法从 UI 删除。这是官方行为。


安全性

删除路由不是裸露的:

  • 先过 connection.requestRejection(req) —— 与官方 Web 路由相同的 Host/Origin 校验 + 浏览器认证,未通过返回 401/403
  • 只接受 Content-Type: application/json(否则 415),杜绝跨站「简单请求」表单提交
  • 校验 sessionId 字符集与长度,拒绝 .. 与路径分隔符
  • 所有 JSON 响应带 cache-control: no-store

工作原理

插件完全建立在官方扩展点上,不修改官方任何一行代码:

部分用到的官方扩展点
删除菜单项sidebar.workspaces.session.menu.item 槽位(官方为插件预留,order 500)
确认弹窗shell.overlay 槽位 + 插件自绘的 Modal / Button(不 import 官方 UI 包)
归档面板图标sidebar.panellist 槽位(order 20)
归档面板页面main 键值槽位(key = dsh-archive-workbench-archived)
删除动作Host 端 ctx.webServer.register() 注册私有路由;客户端 fetch 调用
前端移除行发官方 api-session/removed 事件(在官方转发白名单内)
恢复归档官方 uiWorkspace.unarchiveSession()
清理工作区顺序官方 Workspace.detachSession()
清理投影缓存官方 storageDomain 的 table.delete()

删除逻辑在 Host 端(index.js),UI 在客户端(client.js),通过一条私有 HTTP 路由通信。

为什么 UI 是自绘的? 官方文档明确写着:普通 JS 插件不要 require() Harness 的客户端包(如 @deepseek-ai/dsh-client-ui-primitives)—— 它们不是插件 API,随版本改动,而且一个组件抛错会让整个 slot 条目变成空白。本插件只依赖 react,按钮/弹窗/图标全部自带,外观通过 --dsw-alias-* 主题变量与官方保持一致;四个 slot 条目各自包了 error boundary,单点出错不会拖垮整个界面。


开发

git clone https://github.com/CHYMZXS/dsh-archive-workbench
cd dsh-archive-workbench
npm install
npm test
dsh plugin add .
  • npm test 跑 node:test 冒烟测试(id 校验、路径解码、配置钳制、目录查找)。
  • 改完 client.js 会自动热重载;改 index.js(Host 端)需要重启应用。

License

MIT