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

会话删除 masknull/dsh-delete-session

DeepSeek Harnessv0.1.6
masknull49 天前有提交已提供中文文档扫描:含敏感能力

在侧栏会话菜单中永久删除指定会话

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

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

自动兼容检查有告警:npm 同名包「dsh-delete-session」归属 dddmuc/dsh-delete-session,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add masknull/dsh-delete-session
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · browser
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 49 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意

npm 同名包「dsh-delete-session」归属 dddmuc/dsh-delete-session,装到的可能不是本插件

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-delete-session @ 0.1.6
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/21 23:49:00

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 16 处,展示前 12 条)
  • 发起网络请求
    lib/client.js:382
    return fetch(ROUTE, {
  • 读取本地文件
    src/host/delete-session.mjs:189
    realpath(paths.root),
  • 读取本地文件
    src/host/delete-session.mjs:190
    lstat(paths.projectDirectory, { bigint: true }),
  • 读取本地文件
    src/host/delete-session.mjs:191
    lstat(paths.sessionDirectory, { bigint: true }),
  • 读取本地文件
    src/host/delete-session.mjs:192
    lstat(paths.transcript, { bigint: true }),
  • 读取本地文件
    src/host/delete-session.mjs:204
    realpath(paths.projectDirectory),
  • 读取本地文件
    src/host/delete-session.mjs:205
    realpath(paths.sessionDirectory),
  • 删除本地文件递归
    src/host/delete-session.mjs:356
    await rm(quarantineRoot, { recursive: true, force: true })
  • 删除本地文件递归
    src/host/delete-session.mjs:361
    ?? (directory => rm(directory, { recursive: true, force: false }))
  • 删除本地文件递归
    src/host/delete-session.mjs:366
    await rm(quarantineRoot, { recursive: true, force: true })
  • 删除本地文件递归
    src/host/delete-session.mjs:379
    if (quarantineRoot !== undefined) await rm(quarantineRoot, { recursive: true, force: true }).catch(() => undefined)
  • 删除本地文件递归
    src/host/delete-session.mjs:382
    if (quarantineRoot !== undefined) await rm(quarantineRoot, { recursive: true, force: true }).catch(() => undefined)
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

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

功能亮点

  • 侧栏会话菜单删除
  • 永久删除不可恢复

DSH 插件:在侧栏会话行的 ⋯ 菜单里加「删除会话」(永久删除,不可恢复),不接管也不禁用任何官方插件行。

README

由 DeepSeek 最新模型翻译生成
dsh-delete-session 在 DeepSeek Harness Web 侧栏的会话行 ⋯ 菜单里,增加一项「删除会话」——永久删除该会话。 License: MIT 中文 · English 本插件在侧栏会话行菜单(重命名 / 分叉会话 / 归档会话 之后)追加一个 删除会话 动作,把该会话的转录从磁盘上永久删除。 实现上不禁用、不替换任何官方插件行,也不接管任何宿主服务——因此不会出现"服务无人发布 → 整棵插件树 pending → 启动崩溃"这类故障。 功能 | 永久删除 | 删除该会话独占的 JSONL 转录目录。没有回收站,不可恢复。 | | 强制二次确认 | 弹出写明会话标题的确认框;请求还带一个非简单自定义头,普通 HTML 表单或链接无法伪造。 | | 运行中的会话先停掉 | 先通过宿主句柄拆掉活跃 Agent,等持久化 drain 完成、确认会话已摘载,才碰文件。 | | 记账同步清理 | 从所属工作区摘除、从归档集合摘除、并通知前端移除该行——无需手动刷新。 | | 零接管 | bundle 只 insert 自己一行。不禁用任何行、不替换任何行、不发布任何服务。 | | 跟随主题 | 确认弹窗全部使用 DSH 自己的主题变量,自动适配浅色/深色。
展开完整文档(README 剩余 1 节)
dsh-delete-session

在 DeepSeek Harness Web 侧栏的会话行 ⋯ 菜单里,增加一项「删除会话」——永久删除该会话。

License: MIT
中文 · English

本插件在侧栏会话行菜单(重命名 / 分叉会话 / 归档会话 之后)追加一个 删除会话 动作,把该会话的转录从磁盘上永久删除。

实现上不禁用、不替换任何官方插件行,也不接管任何宿主服务——因此不会出现"服务无人发布 → 整棵插件树 pending → 启动崩溃"这类故障。

功能

| 永久删除 | 删除该会话独占的 JSONL 转录目录。没有回收站,不可恢复。 |
| 强制二次确认 | 弹出写明会话标题的确认框;请求还带一个非简单自定义头,普通 HTML 表单或链接无法伪造。 |
| 运行中的会话先停掉 | 先通过宿主句柄拆掉活跃 Agent,等持久化 drain 完成、确认会话已摘载,才碰文件。 |
| 记账同步清理 | 从所属工作区摘除、从归档集合摘除、并通知前端移除该行——无需手动刷新。 |
| 零接管 | bundle 只 insert 自己一行。不禁用任何行、不替换任何行、不发布任何服务。 |
| 跟随主题 | 确认弹窗全部使用 DSH 自己的主题变量,自动适配浅色/深色。 |
| 双语 | 菜单项与弹窗跟随宿主语言(中文 / English);宿主 locale 服务缺失时回退到内置对照表。 |

环境要求

- 使用 Web profile 的 DeepSeek Harness(dsh web)。
- 逐会话 JSONL 持久化后端(session-persistence-jsonl,即默认后端)。
- 已在 DSH 0.1.5-rc.2 实测。删除路由采用失败即降级策略:前置条件缺失时只是不注册路由、UI 上报请求失败,插件激活期间永不抛错。

安装

从 git 仓库安装
dsh plugin --profile web add github:masknull/dsh-delete-session

或从本地目录安装
dsh plugin --profile web add link:/path/to/dsh-delete-session

安装后重启 dsh web,让插件树重新合成。

卸载

dsh plugin --profile web remove dsh-delete-session

为什么写这个插件

需要的只是「删除会话」这一个功能。同类插件通常会把归档、恢复、搜索等一整套会话管理一起带进来,而使用中还遇到过 dsh web 偶发性的启动失败——排查了一个下午才定位到原因。既然只需要删除,就单独写了这个插件,只做这一件事。

工作原理

DSH 目前没有公开的会话删除 API:ctx.workspaceRegistry 只有 archiveSession(软删除,仅打标记)和 deleteKnown(删的是工作区不是会话);api-session-controller 的 remote 面有 create / rename / fork / list / search,没有 delete。而且会话行的 ⋯ 菜单不是扩展点——菜单项硬编码在官方 ui-workspace 的 SessionNodeItem 组件里,会话行内部没有任何 slot。

因此本插件不去 fork 官方 UI,而是走两条在真实运行界面上验证过的 DOM 缝:

1. 会话行 → React fiber:会话行是 [role="treeitem"],顺着 fiber 链向上可拿到 SessionNodeItem 的 memoizedProps,其中 node.id 即 sessionId(另有官方 onRename / onFork / onArchive 仅作形状判据)。
2. 打开中的菜单弹层:菜单是 [role="menu"] 的 portal,项为 [role="menuitem"]。当某个已解析出会话 id 的行打开菜单时,追加一项。类名在运行时从当前渲染中的官方项复制,所以即使构建哈希变化也能继承真实样式;图标用的是从本机前端产物里取出的官方 IconTrashOutline16 几何,与原生三个图标同族。

两条缝任一消失(官方将来改版),表现是菜单里不再出现该项——绝不会退化成"猜一个 sessionId 去删"。

Host 侧

只有一条路由:POST /plugins/dsh-delete-session/delete。

删除实现移植自 dsh-chat-manager(MIT,见文末许可),它有几处严谨设计值得保留:

- 目标路径必须是会话根下恰好三段,且转录文件名匹配 JSONL 代际规则;
- 会话目录先原子改名进隔离区,再用 dev/ino/mode/size/birthtimeNs 复核身份,之后才递归删除(防 TOCTOU 与符号链接替换);
- 活跃 Agent 通过从 agents.create / resume / enter 捕获的 handle 释放,删除期间用 reservation 拒绝同 id 重开;
- 请求边界强制:仅 POST、同源、确认头、JSON 类型、8KB 体积上限、sessionId 形状校验。

在移植之上新增的部分:物理删除完成后,用公开 API 对账——
workspaceRegistry.list() 找到持有该会话的实体 → entity.detachSession(id)(公开、幂等、不碰会话日志),
再从 archivedSessionIds 摘除该 id,最后广播 api-session/removed,让官方客户端移除该行。

不删除什么

投影缓存行(session_projcache)有意保留。会话列表的数据源是磁盘扫描 + host/client 双重 join 过滤,孤儿缓存行不会渲染成可见条目。要清它就必须替换官方 session-projection-cache 服务——而那正是本插件刻意回避的接管方式。

主题与颜色

确认弹窗的颜色全部取自 DSH 自己的主题变量。这些变量声明在 上,并在 body[data-ds-dark-theme] 下重新声明,因此一份声明同时适配深浅主题:

| 用途 | 变量 |
| 弹窗背景 | --dsw-specific-menu → --dsw-alias-bg-layer-3 |
| 主文字 | --dsw-alias-label-primary |
| 边框 | --dsw-alias-border-l2 |
| 危险色 | --dsw-alias-state-error-primary |
| 遮罩 | --dsw-alias-bg-mask-1 |
| 阴影(含 0.5px 描边) | --dsw-elevation-panel |
| 字体 | --dsw-font-family |

两个踩过的坑:

- 不要凭直觉编造变量名。 初版用了 --dsw-alias-bg-elevated 这类看起来很像的名字——它们根本不存在,于是背景 fallback 到硬编码深灰,而文字变量恰好存在并取到主题深色值,浅色主题下就成了深底深字。
- 变量定义在 而不是 :root。 直接读 document.documentElement 会全部拿到空值;要用挂在 body 下的元素去读。

const probe = document.createElement('div'); document.body.appendChild(probe);
getComputedStyle(probe).getPropertyValue('--dsw-specific-menu'); // 空串 = 不存在
probe.remove();

失效表现与排查

本插件依赖上面两条 DOM 缝。官方若改动它们,表现是菜单里不再出现「删除会话」——不会误删任何数据。

排查顺序:

1. 会话行是否仍是 [role="treeitem"],其 fiber 链上是否还有带 node.id + onRename 的 props;
2. 菜单是否仍是 [role="menu"] / [role="menuitem"];
3. React 是否仍把 fiber 挂在 DOM 节点上(__reactFiber$ / __reactInternalInstance$ 前缀)。

许可

MIT。src/host/ 下的删除实现移植自 dsh-chat-manager(MIT),各文件头部保留了出处与改动说明。

致谢

感谢 dsh-chat-manager(作者 WSL043):本插件的核心建立在它的 Host 侧删除实现之上。那些真正困难的部分——捕获 Agent 句柄、带身份复核的隔离区改名、请求边界校验——它都已经解决得很好,这也正是本插件能做得这么小的原因。

同样感谢 DeepSeek Harness 官方团队:本插件使用的主题变量、locale 服务与 IconTrashOutline16 图标几何,都来自官方前端。
预览分享卡片长什么样 ↓masknull/dsh-delete-session
分享 · DeepSeek Harness Hub
masknull/dsh-delete-session

在侧栏会话菜单中永久删除指定会话

这是你的仓库?认领条目

回到顶部