🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

会话永久删除 lingshidu/dsh-delete-session

DeepSeek Harness
lingshidu18 天前有提交已提供中文文档扫描:未发现敏感能力

从侧栏彻底删除会话及其本地全部记录

29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/17 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add lingshidu/dsh-delete-session
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · browser
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 18 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

发起外部网络请求
查看扫描证据(共 1 处,展示前 1 条)
  • 发起网络请求
    client.js:214
    fetch(ROUTE, {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 0.2 会话删除插件:通过官方 slot API 在侧边栏会话行菜单里加上「删除会话」,背后由 Host 路由支撑,负责移除会话产物并维护工作区账本。

README

由 DeepSeek 最新模型翻译生成
dsh-delete-session DSH(DeepSeek Harness)0.2.x 的会话「永久删除」插件。 补上官方缺失的能力:在侧栏会话行上删除该会话的全部本地记录。 为什么重写而不是修复旧插件 社区插件 dsh-session-delete@0.1.0 是按 DSH 0.1.0-rc.6 写的,在 0.2.0-rc.2 上失效。它失效的方式是静默的 —— 不报错,菜单就是不出现。原因有两条,都源于它采用了 DOM 克隆 + React fiber 探测: | 旧插件依赖 | 0.2.0-rc.2 实际 | | 菜单 memoizedProps.items 数组 | 会话菜单改传 children: renderSlot(...),没有 items | | 会话行 props 含 onArchive | SessionNodeItem({ node, currentId, now, onOpen, onRenameRequest, renderSlot, onReveal, drag, t }) —— onArchive/onFork 已移除(改由 slot 提供) | 本插件改为使用 DSH 0.2 官方开放的 slot,因此不依赖任何内部 props 或 DOM 结构:
展开完整文档(README 剩余 1 节)
dsh-delete-session

DSH(DeepSeek Harness)0.2.x 的会话「永久删除」插件。

补上官方缺失的能力:在侧栏会话行上删除该会话的全部本地记录。

为什么重写而不是修复旧插件

社区插件 dsh-session-delete@0.1.0 是按 DSH 0.1.0-rc.6 写的,在 0.2.0-rc.2 上失效。它失效的方式是静默的 —— 不报错,菜单就是不出现。原因有两条,都源于它采用了 DOM 克隆 + React fiber 探测:

| 旧插件依赖 | 0.2.0-rc.2 实际 |
| 菜单 memoizedProps.items 数组 | 会话菜单改传 children: renderSlot(...),没有 items |
| 会话行 props 含 onArchive | SessionNodeItem({ node, currentId, now, onOpen, onRenameRequest, renderSlot, onReveal, drag, t }) —— onArchive/onFork 已移除(改由 slot 提供) |

本插件改为使用 DSH 0.2 官方开放的 slot,因此不依赖任何内部 props 或 DOM 结构:

- sidebar.workspaces.session.menu.item —— 会话行 … 菜单项
- sidebar.workspaces.session.row.action —— 会话行悬停图标按钮
- shell.overlay —— 确认对话框

功能

| 入口 | 行为 |
| 会话行 … 菜单 → 删除会话 | 红色危险项,排在内置 Archive 之后另起一组 |
| 会话行悬停 → 垃圾桶图标 | 同一动作的快捷入口 |
| 确认对话框 | 明确「不可恢复」;删除中显示进度;失败显示具体原因;内存态未释放时给出重启提示 |

删除是永久的,不可恢复(没有回收站)。删除内容:

1. 会话产物目录 <DSH_HOME>/sessions/<项目编码>/<会话>/(含日志文件)
2. 工作区账目:从 archivedSessionIds 与归属工作区的 sessionIds 中摘除
3. 投影缓存 <DSH_HOME>/storages/session_projcache/sessions/<会话>.json(尽力而为)

正在运行的会话(有进行中的 turn)一律拒绝删除。

为什么不能简单地「live 就拒绝」

DSH 0.2 的侧栏用 session 作用域 slot 渲染会话行,官方文档明确写了这会「激活并保留列表中每个 Session」。也就是说 凡是出现在列表里的会话都是 live 的(ctx.sessions.get(id) 非 undefined)。若据此拒绝,所有会话都删不掉 —— 这正是同类旧插件的主要缺陷。

真正危险的是「正在运行」和「仍被某个查看器持有」,所以删除流程是:

1. 运行中检查:ctx.agents.get(id)?.status === 'running' → 拒绝
2. 定位并校验会话目录(下面的三重守卫)
3. 摘除工作区账目 —— 让侧栏行消失,客户端随之释放它的 session scope
4. 等待宿主卸载该会话(轮询 ctx.sessions.get(id) 变 undefined)
- 等到 → 内存态已释放,删文件安全
- 超时 → 仍然继续删除,但在响应里回报 resident,前端提示「重启 DSH 可确保彻底生效」
5. 删除会话产物目录(带重试,处理 Windows 瞬时文件占用);失败则回滚账目,不留下「已隐藏但未删除」
6. 清理投影缓存(尽力而为)

这样「删掉正在运行的会话」和「已删除却被内存态回写复活」都不会发生。

安全设计

宿主半在动文件之前执行三重路径守卫,全部通过才允许递归删除:

1. dirname(dirname(会话目录)) 的 basename 必须恰好是 sessions
2. 必须存在「项目目录 / 会话目录」两级且互不相同
3. 该目录内必须确实存在 *.jsonl(.zstd) 会话产物

写入路径用 node:fs 直接操作(不经 shell),因此没有命令注入面,也不需要引号转义。

安装

直接从 GitHub 安装
dsh plugin --profile <profile> add github:lingshidu/dsh-delete-session

或从本地目录(file: 协议;pnpm 会复制而非软链,改动源码后需重新执行安装)
dsh plugin --profile <profile> add /path/to/dsh-delete-session

安装后插件管理器会自动把它写入 profile 的 dsh.profile.bundles。

安装后需要重载窗口(Ctrl+R)或重启 DSH,客户端半才会被加载。

手动兜底:pnpm add /path/to/dsh-delete-session,然后在 profile 的 cordis.patch.yml 加入

- insert:
- id: dsh-delete-session
name: dsh-delete-session

卸载

dsh plugin --profile <profile> remove dsh-delete-session

验证

宿主半提供两个同源路由,可直接探测:

路由是否已加载(参数不合法应返回 400 bad-args)
curl -X POST http://127.0.0.1:19387/dsh-delete-session/delete \
-H 'content-type: application/json' -d '{}'

只做定位与校验,不删除任何东西
curl -X POST http://127.0.0.1:19387/dsh-delete-session/inspect \
-H 'content-type: application/json' -d '{"sessionId":"<会话id>"}'

inspect 返回 { ok, live, resolvable, dir },用于确认会话能否被正确定位。

实现要点

- Host 半(index.js):inject: ['webServer','sessionPersistence','workspaceRegistry','sessions']。
- sessionPersistence.list() 在 0.2.x 返回 { header, revision, sizeBytes }[](不是 header[]),本插件兼容两种形状。
- sessionPersistence.locate(header) 返回日志文件路径,其 dirname 才是会话目录。
- Client 半(client.js):Module Loader 包(window.__ModuleLoader__.load({ factory(require) }))。
- 组件身份模块级稳定;@deepseek-ai/dsh-client-ui-primitives 经 loader 的 require 解析(隐式 baseline external,不自带副本)。
- 菜单项与浮层对话框通过模块级 store + useSyncExternalStore 共享待确认请求。

已知限制

- 工作区级批量操作无法通过 slot 实现。0.2.0-rc.2 的工作区行菜单项是 ProjectRowItem 内写死的 [{id:'rename'},{id:'delete'}],没有开放 slot。若需要「删除整个工作区的全部会话」,只能再走 DOM 注入那条脆弱路线,本插件有意不做。
- 会话行菜单项只在会话行出现;归档行同样可用。
- 兼容性依据 DSH 0.2.0-rc.2 的实际接口编写。若宿主大版本升级后 slot 名称变化,ctx.slots.inject() 会等待声明,注册项只是不出现(不会报错)—— 可用窗口控制台的 slots.inject(...) 日志排查。

License

MIT
预览分享卡片长什么样 ↓lingshidu/dsh-delete-session
分享 · DeepSeek Harness Hub
lingshidu/dsh-delete-session

从侧栏彻底删除会话及其本地全部记录

这是你的仓库?认领条目

回到顶部