dsh-session-delete
DiscoveredA real "Delete session" for DeepSeek Harness. Not archive - erase. | 真正的「删除会话」,不是归档,是删干净。
dsh-session-delete
给 DeepSeek Harness 会话菜单加一行真正意义上的「删除会话」。
DSH 自带的「归档」只是把会话藏起来:日志目录还在磁盘上、Workspace 的 sessionIds 还占着名额、置顶记录还留着、投影缓存里还存着标题。这个插件补上缺的那一环——停止 → 归档 → 解绑 → 取消置顶 → 删日志 → 删缓存 → 通知前端,整套做完,而且删不掉时会把前面的每一步回滚。
亮点
- 两次点击确认,第一下进入确认态,第二下才执行;菜单一关就自动解除武装,不会出现「上次点了一半、这次一点就删」。
- 完整删除,不是隐藏。归档留下的僵尸工作区记录、置顶记录、投影缓存一并清掉。
- 失败可回滚。日志仍被写入方占用时,自动
attachSession放回工作区、unarchiveSession取消归档,行内提示可重试。 - 视觉与原生一致。复用宿主
sidebar.workspaces.session.menu.item插槽,几何参数、危险色 token、垃圾桶图标都对齐全套菜单。 - 零构建、零运行时依赖。主机半部是原生 ESM(
apply(ctx, config)),客户端半部由window.__ModuleLoader__.load注册进宿主模块图;合计 387 + 236 行,装完即用。 - 中英双语,跟随界面语言。
效果
会话「⋯」菜单 → 追加一行红色「删除会话」:
会话 A ⋯
├─ 置顶
├─ 重命名
├─ 分叉
├─ 归档
├─ 复制 Session ID
└─ 🗑 删除会话 ← 本插件
| 状态 | 显示 |
|---|---|
| 待命 | 删除会话(常态红) |
| 已武装 | 再次点击删除 |
| 执行中 | 正在删除会话… |
| 成功 | 会话已删除 |
| 失败 | 删除失败,点击重试(悬停看原因) |
安装
需要 DeepSeek Harness 0.2.1-rc.3 或更高(见兼容性),以及安装流程用到的 pnpm。本包没有发布到 npm。
不要用裸包名安装。 npm 上
dsh-session-delete这个名字属于另一个作者的同类插件(vtxf/dsh-session-delete,0.1.0,2026-08 发布)。执行dsh plugin add dsh-session-delete会装到那一个,而不是这个。本仓库一律用完整 git URL + 固定 commit,这也是下面三种方式都这么写的原因。
方式一:Web 界面
设置 → 插件 → 安装,填入:
git+https://github.com/EndlessPoem/dsh-session-delete.git#v1.0.0
方式二:命令行
需要 dsh CLI 在 PATH 上(桌面版内置的那份不在 PATH 里,此时用方式一或方式三)。--profile 换成你自己的 profile 名,默认是 desktop:
dsh plugin --profile desktop add "git+https://github.com/EndlessPoem/dsh-session-delete.git#v1.0.0"
#v1.0.0 指向 release tag。想要严格可复现(tag 被移动也不受影响)就换成 40 位完整 commit SHA,形如 #c846167fd80b6ab02c14f9f6c0ba9d45a1b88a02——插件市场索引的 git 源就要求这种写法。不要直接用 #main:分支一推,所有人的依赖都会悄悄换版本。
方式三:手写 profile
编辑 ~/.dsh/profiles/<profile>/package.json:
{
"dependencies": {
"dsh-session-delete": "git+https://github.com/EndlessPoem/dsh-session-delete.git#v1.0.0"
},
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-session-delete"
]
}
}
}
再在 profile 目录执行 pnpm install,重启 DSH。
装好后在设置 → 插件列表里确认 dsh-session-delete 处于已选中状态。
它到底删了什么
点下第二次时,Host 按顺序执行:
| # | 动作 | 用到的宿主能力 |
|---|---|---|
| 1 | 停掉正在跑的工作 | agents.get(id).cancel({ kind: 'user' }) |
| 2 | 归档,立刻从侧栏分组消失 | workspaceRegistry.archiveSession(id, { stopActivity: true }) |
| 3 | 从每个 Workspace 的 sessionIds 摘除 | workspace.detachSession(id) |
| 4 | 从全局置顶集合移除 | workspaceRegistry.unpinSession(id) |
| 5 | 删除会话目录整棵树 | <root>/<slug>/<id>/,含 session.v4.jsonl.zstd |
| 6 | 删除投影缓存条目 | storages/session_projcache/sessions/<id>.json |
| 7 | 通知前端丢掉这一行 | api-session/removed |
第 3 步是这个插件存在的理由。 归档不改变 sessionIds 成员关系,光删日志的话,工作区里会永远躺着一个点不开的死记录。
第 5 步失败会触发回滚:撤销第 3、4、2 步,行内报「删除失败,点击重试」。所以不会出现「行没了、数据还在」或者「数据没了、行还在」的半删状态。删除重试最多 8 次,间隔递增,专门对付 Windows 上文件句柄晚释放的情况。
存储根目录怎么找
按顺序取第一个命中项:
- 本插件配置
config.sessionsRoot - 活动
configEditor里@deepseek-ai/dsh-session-persistence-jsonl的root - 环境变量
DSH_SESSION_ROOT $DSH_HOME/sessions~/.dsh/sessions
每个根目录下两种布局都支持:<root>/<项目目录>/<sessionId>/(默认),或根目录本身已按工作区隔离时的 <root>/<sessionId>/。
投影缓存目录同理,可用 config.projectionCacheDir 覆盖。自定义放在 cordis.patch.yml:
- id: dsh-session-delete
config:
sessionsRoot: 'D:\my-dsh\sessions'
projectionCacheDir: 'D:\my-dsh\storages\session_projcache\sessions'
接口
POST /session-delete/delete
{ "sessionId": "session-..." }
仅接受同源请求(校验 Origin/Host,拒绝 sec-fetch-site: cross-site 与 Origin: null)。
| 状态 | code | 含义 |
|---|---|---|
| 200 | — | { ok: true, removed: true, dir, root, archived, detached, warning? } |
| 400 | bad-request | sessionId 非法或请求体超过 16 KiB |
| 403 | cross-origin | 非同源请求 |
| 404 | session/not-found | 所有候选根目录下都找不到该会话,响应里带 searched 列表 |
| 405 | method | 非 POST |
| 409 | session/locked | 日志仍被占用,归档与工作区归属已回滚 |
| 500 | internal | 未预期异常 |
已知边界
Harness 目前没有公开的「销毁单个 Agent / Session」原语:已加载的会话归宿主根 fiber 所有,只能随进程退出释放。因此对当前进程已加载的会话:
- 日志目录、投影缓存、工作区归属、置顶记录都已清除,重启后任何视图都查不到;
- 内存中的 Agent 对象要到进程重启才消失,所以本次运行期间该 id 仍可能出现在「全部对话(显示已归档)」筛选下。
未加载过的会话(绝大多数历史会话)删完立刻从所有视图消失。
另外两点:
- 删除不可恢复,没有回收站。需要留底的话先手动备份
<root>下对应目录。 - 删除过程中如果 DSH 被强杀,可能出现「第 2–4 步已生效、第 5 步未完成」的中间态;此时日志目录仍在,工作区归属已摘除,重新安装启动后该会话不会出现在列表里,但磁盘上有残留——按上文的根目录布局手删即可。
兼容性
| 项目 | 要求 |
|---|---|
| DeepSeek Harness | >=0.2.1-rc.3 <0.3.0 |
| Node.js | >=20 |
| 平台 | Web / Desktop(需要 webServer 与 Web 前端) |
DSH 对预发布版本的 SemVer 比较是严格的:0.2.1-rc.3 不满足 ^0.2.1,所以 engines.dsh 写成区间形式而不是 caret。
开发
git clone https://github.com/EndlessPoem/dsh-session-delete.git
cd dsh-session-delete
没有构建步骤。本地联调用 link: 依赖把它挂进 profile:
"dsh-session-delete": "link:/absolute/path/to/dsh-session-delete"
改了 client.js 需要在 DSH Web 页面刷新;改了 index.js(主机半部)需要重启 DSH。
目录结构与职责:
package.json dsh.manifestVersion / dsh.bundle.patch / dsh.client 声明
cordis.patch.yml Loader 行:把插件插进 profile 的树里
index.js 主机半部:POST 路由 + 七步删除 + 回滚
client.js 客户端半部:菜单行、确认态、错误就地展示、内嵌中英词典
locale/en.json 插件列表里显示的名称与简介(meta)
locale/zh.json 同上,中文
icon.svg 插件图标
文案有两份是有意的:locale/*.json 只承载插件列表里的 meta(标题、简介),菜单行的运行时文案(含「再次点击删除」等状态)内嵌在 client.js 里,避免前端每次切换语言都多一次资源请求。改文案时两处都要对。
客户端半部通过 window.__ModuleLoader__.load 注册,注入 slots 与 locale,槽位 id 是 sidebar.workspaces.session.menu.item,order: 500 让它排在内置行之后。data-session-delete 属性暴露当前状态(idle / confirm / busy / done / failed),方便写 UI 测试。
贡献时请保持两条底线:不新增运行时依赖,不为了删干净去碰宿主的私有状态——只用 apply(ctx, config) 拿到的公开服务。
许可
Comments
Loading…
Similar plugins
by Linusteller
DeepSeek Harness 插件:侧栏会话菜单「删除会话」(永久删除,非归档)
★ 2
MIT
JavaScript
Oct 22, 2026
dsh plugin --profile web add dsh-delete-sessionsby luckamuu
DeepSeek Harness 插件:提供删除已归档会话的入口(可以彻底删除不会在次出现)
★ 0
MIT
JavaScript
Oct 8, 2026
dsh plugin --profile web add @local/archived-sessionsby xohmai
DeepSeek Harness 会话删除插件:设置页管理归档会话,真正删除磁盘日志(回收站可还原)+ 批量清理——官方归档只隐藏不删盘,这里补上。
★ 42
↓ 280/wk
Apache-2.0
JavaScript
Oct 19, 2026
dsh plugin --profile web add dsh-session-deleteby lxchapu
DSH(DeepSeek Harness)插件:把会话从磁盘上彻底删除。任意会话的「…」菜单里可删单条,侧边栏切到「仅显示已归档」时可一键删除全部已归档会话;两者都先弹二次确认,正在运行的会话会被拒绝删除。
★ 1
MIT
JavaScript
Oct 3, 2026
dsh plugin --profile web add @lxchapu/dsh-session-purgeby akira399
Permanently delete DSH sessions from the file system, right from the sidebar conversation menu (真正的物理删除,不是归档隐藏).
★ 3
↓ 320/wk
MIT
JavaScript
Aug 15, 2026
dsh plugin --profile web add dsh-session-deleteby NIGHT576
Real deletion for DSH Web conversations: a session-row menu action and a Workspaces-header batch dialog; removes each session's log directory and projection cache. 给 DSH Web 侧栏补上真正的会话删除:右键菜单删单条、区头批量删多
★ 0
MIT
JavaScript
Sep 12, 2026
dsh plugin --profile web add dsh-delete-session