READMESource: main@2a46157a
dsh-session-manager
给 DeepSeek Harness 桌面版用的会话管理插件:在左侧导航栏加一条「会话管理」,集中查看、筛选、批量删除会话与工作区。
硬删除,不留备份。 删掉就是删掉。

装
一条命令,装完重启就出现在左侧,不需要任何手工配置:
dsh plugin --profile desktop add https://github.com/daxianya/dsh-session-manager/releases/latest/download/dsh-session-manager.tgz
然后 ⌘Q 退出再打开。
也可以用本地 tgz:
dsh plugin --profile desktop add ./dsh-session-manager-0.2.0.tgz
dsh plugin add 会自动装依赖、登记 dependencies、并把包写进 dsh.profile.bundles——手不用碰配置文件。
确认装好了:
dsh --profile desktop --dump-config | grep -A2 session-manager
卸载:
dsh plugin --profile desktop remove dsh-session-manager
能干什么
| 功能 | 说明 |
|---|---|
| 会话列表 | 标题、回合数、体积、最后活动、所属工作区 |
| 批量删除 | 勾选后一次删掉,两步确认,删目录 + 清索引 + 清缓存 |
| 单条删除 | 行尾垃圾桶图标,点两下确认 |
| 排序 | 按时间 / 体积 / 回合 / 标题,可切升降序 |
| 只看无项目 | 筛出工作区已被删掉的孤儿会话 |
| 空会话清理 | 点了「新会话」但一句话没发的空壳,软件本身不显示,可在设置里清掉 |
| 失效记录清理 | 名单上还留着、文件已经不在的残留条目 |
| 5 种布局 | 表格 / 卡片 / 按项目分组 / 左右分栏 / 带体积条 |
| 外观 | 浅色 / 深色 / 跟随系统,字号 3 档,只作用于本面板 |
安全设计
- 不删当前正在对话的会话:服务端读会话状态,正在跑回合的直接拒绝,理由回传「正在运行回合」
- 同源校验:非本机 Origin 的 POST 一律 403
- id 白名单:只接受
session-<uuid>格式,../这类路径穿越直接判非法 - 原子写:改
workspace.json走临时文件 + rename,不会写出半个文件
界面
![]() |
![]() |
![]() |
![]() |
想看五种布局的对比,用浏览器打开 design/preview.html。
结构
client.js 前端:面板 UI、5 种布局、设置、事件委托
lib/index.js 后端:4 个 HTTP 接口、会话扫描、删除、修复
cordis.patch.yml 告诉宿主「把我挂进去」
package.json dsh.bundle / dsh.client 声明
接口
| 方法 | 路径 | 作用 |
|---|---|---|
| GET | /dsh-sm/sessions |
列出会话、工作区、孤儿、统计 |
| POST | /dsh-sm/delete |
批量删除 {ids: [...]} |
| POST | /dsh-sm/repair |
清理失效记录 {dryRun?} |
| POST | /dsh-sm/purge-blank |
清理空会话 {dryRun?} |
侧边栏从哪来
插件自己注册,不依赖宿主预留位置:
ctx.slots.inject("sidebar.panellist", () =>
ctx.slots.register(
{ name: "sidebar.panellist", id: PANEL_ID, order: 20, label: "会话管理" },
PanelIcon));
ctx.slots.inject("main", () =>
ctx.slots.register({ name: "main", key: PANEL_ID, inject: () => ({}) },
SessionManagerPage));
order 控制排序,label 控制显示名。
已知限制
- 删完请重启一次:宿主内存里还留着会话对象,它下次写
workspace.json时可能把 id 写回去,产生「名单上有、磁盘上没有」的失效记录。设置面板里的「清理失效记录」能修,但要先⌘Q退出再点,否则会被覆盖回去。 - 只测过 macOS + DeepSeek Harness 桌面版。
License
MIT




No comments yet. Be the first to write one.