dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
在侧边栏会话行菜单中新增「删除会话」,永久清除该会话的日志目录、投影缓存与归档/置顶记录,并让该行从侧边栏消失;同时在侧边栏提供已归档会话面板,可恢复或删除已归档会话。
归档工作台 — DeepSeek Harness 的会话删除 + 归档管理插件。
中文 | English
DeepSeek Harness 官方只能归档会话(隐藏,不删盘),也没有一个方便的地方查看已归档的会话。这个插件补上这两块:
归档会话面板 —— 侧边栏的「已归档会话」,每行可恢复归档或删除:

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

在任一会话行的「...」菜单最下方(复制 Session ID 之后,带分隔线):
置顶 → 重命名 → 分叉 → 归档 → 复制 Session ID → 删除会话
点击后弹出确认框,确认即永久删除:
~/.dsh/sessions/<项目>/<会话ID>/)~/.dsh/storages/session_projcache/sessions/<会话ID>.json)已归档的会话同样支持 —— 菜单项不区分状态。
侧边栏底部图标栏(与「插件」「定时」并排)多一个归档图标,点开后在主区域显示整页列表:
已归档会话 2
归档的会话会显示在这里,可随时恢复或删除。
┌─────────────────────────────────────────────────────────┐
│ 会话标题 [恢复归档] [删除] │
│ session-cf676d08-1890-427e-aa64-34a910d31600 │
│ 工作区:dsh-test │
└─────────────────────────────────────────────────────────┘
unarchiveSession,该行立即消失,会话回到原工作区位置;成功后底部有 aria-live 提示顺便说明:官方其实也有查看归档会话的入口(侧边栏顶部「视图选项」→ 全部对话(显示已归档)),但入口较深,且那里没有恢复/删除按钮 —— 恢复还得回到会话行的「...」菜单。本面板把这两件事集中到一个地方。
方式一:插件市场(推荐)
在 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/403Content-Type: application/json(否则 415),杜绝跨站「简单请求」表单提交sessionId 字符集与长度,拒绝 .. 与路径分隔符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 端)需要重启应用。MIT