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. 会话菜单:删除会话
在任一会话行的「...」菜单最下方(复制 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,可在插件设置里调整(都有默认值,不配也能用):
| 配置项 | 默认值 | 说明 |
|---|---|---|
idleTimeoutMs | 8000 | 删除驻留会话时,等待它空闲的上限(毫秒) |
settleAttempts | 6 | 删完后复查日志是否被重建的次数 |
settleDelayMs | 250 | 每次复查之间的间隔(毫秒) |
maxBodyBytes | 4096 | 删除路由接受的请求体上限(字节) |
sessionsRoot | "" | 自定义会话根目录;留空则用 DSH_HOME/sessions 或 ~/.dsh/sessions |
已知限制
正在运行的会话(重要)
DeepSeek Harness 没有任何公开 API 能让一个会话从内存中退出。因此对于本次运行中打开过、还驻留在内存里的会话,删除文件不够 —— 它可能立刻把日志重新写回来。
插件的处理方式是:
- 先调用官方
archiveSession({ stopActivity: true }),停掉它正在跑的工作并封住后续写入 - 等它空闲(最多
idleTimeoutMs) - 再删文件
- 删完反复复查(最多
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