在侧栏会话菜单中永久删除指定会话
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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 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🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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 图标几何,都来自官方前端。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
masknull/dsh-delete-session
在侧栏会话菜单中永久删除指定会话
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目