从侧栏永久删除会话并清理全部本地残留
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add hitzhangjie/dsh-plugin-session-delete该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · browser
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 19 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 15 处,展示前 14 条)
- 读取本地文件lib/index.js:148
const parsed = JSON.parse(await readFile(pendingPath(), "utf8")); - 写入本地文件lib/index.js:158
await mkdir(join(file, ".."), { recursive: true }); - 写入本地文件lib/index.js:159
await writeFile(file, `${JSON.stringify(ids, void 0, 2)}\n`, "utf8"); - 读取本地文件lib/index.js:193
for (const projectName of await readdir(root).catch(() => [])) { - 读取本地文件lib/index.js:196
await stat(candidate); - 删除本地文件递归lib/index.js:197
await rm(candidate, { recursive: true, force: true }); - 删除本地文件lib/index.js:202
await rm(join(home, "storages", "session_projcache", "sessions", `${id}.json`), { force: true }); - 读取本地文件lib/index.js:227
for (const projectName of await readdir(root).catch(() => [])) { - 删除本地文件递归lib/index.js:324
await rm(directory, { recursive: true, force: true }); - 删除本地文件lib/index.js:330
await rm(projectionCache, { force: true }); - 读取本地文件lib/index.js:335
for (const name of await readdir(tmpdir())) { - 删除本地文件递归lib/index.js:337
await rm(join(tmpdir(), name, `session-${spillHash}`), { recursive: true, force: true }); - 读取本地文件lib/index.js:348
await stat(directory); - 发起网络请求lib/client.js:157
pending = fetch(ROUTE, {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 插件:在侧边栏会话菜单里永久删除会话——先停掉正在跑的任务,拒绝分叉的父会话,并清空所有本地存储位置。
README
由 DeepSeek 最新模型翻译生成@hitzhangjie/dsh-plugin-session-delete
DeepSeek Harness 只提供「归档」:归档的会话永远留在磁盘上。这个插件补上缺失的那一步——真正彻底删除一个会话,入口在侧栏会话行的 ... 菜单里。
一个 DSH bundle(声明了 dsh.bundle.patch),所以 dsh plugin --profile <profile> add <path> 安装后会被自动选入 profile 层,不需要手写 cordis.patch.yml 行。
功能
- 侧栏会话菜单项:sidebar.workspaces.session.menu.item 槽位里的红色「删除会话…」,和内置的 置顶 / 重命名 / Fork / 归档 用同一套 MenuItemButton 呈现。
- 两步确认:第一次点击把标签变成「确认永久删除「<标题>」?」,5 秒不确认自动复位;第二次点击才真正删除。悬停的提示文字也说明了后果。
- 先停活:删除前通过归档的 stopActivity 瀑布停止运行中的工作(durable archive 集合会挡住这些停止所引发的任何唤醒),再等会话落盘安静后继续。
- 拒绝仍有 fork 子会话的会话:子会话的 header 里记着父 id,删掉父会话会让这条血缘悬空,所以直接拒绝并把子会话 id 返回给界面。
展开完整文档(README 剩余 1 节)
@hitzhangjie/dsh-plugin-session-delete
DeepSeek Harness 只提供「归档」:归档的会话永远留在磁盘上。这个插件补上缺失的那一步——真正彻底删除一个会话,入口在侧栏会话行的 ... 菜单里。
一个 DSH bundle(声明了 dsh.bundle.patch),所以 dsh plugin --profile <profile> add <path> 安装后会被自动选入 profile 层,不需要手写 cordis.patch.yml 行。
功能
- 侧栏会话菜单项:sidebar.workspaces.session.menu.item 槽位里的红色「删除会话…」,和内置的 置顶 / 重命名 / Fork / 归档 用同一套 MenuItemButton 呈现。
- 两步确认:第一次点击把标签变成「确认永久删除「<标题>」?」,5 秒不确认自动复位;第二次点击才真正删除。悬停的提示文字也说明了后果。
- 先停活:删除前通过归档的 stopActivity 瀑布停止运行中的工作(durable archive 集合会挡住这些停止所引发的任何唤醒),再等会话落盘安静后继续。
- 拒绝仍有 fork 子会话的会话:子会话的 header 里记着父 id,删掉父会话会让这条血缘悬空,所以直接拒绝并把子会话 id 返回给界面。
- 本地零残留,按顺序清理:
1. 事件日志目录 <persistence root>/<projectKey>/<sessionId>/(先按 header 的 cwd 精确算路径,再扫描 session root 兜底)
2. 投影缓存 <home>/storages/session_projcache/sessions/<id>.json
3. 会话的 spill 目录 <tmp>/dsh-spill-*/session-<sha256(id)[:12]>/
4. 工作区记账 Workspace.detachSession(id)
5. 归档 / 置顶集合中的该 id
6. 活的 store 条目(如果 store 暴露了 detach)
- 立即从侧栏消失:删除成功后宿主发出 api-session/removed,同时浏览器半区调用客户端 sessions.refresh() 重新拉取权威列表——冷会话(本次进程没打开过)不会发出任何 disposal 帧,只有重新拉取才能让它的行消失。
- 写者占用时不留半成品:文件仍被活的写句柄占住时,id 会记入 <home>/plugins/session-delete.pending.json,下次启动(此时所有会话都是冷的)自动补删。
安装
1) 检出
git clone https://github.com/hitzhangjie/dsh-plugin-session-delete.git
2) 装进你使用的 profile(桌面版 Harness 固定使用保留 profile desktop)
dsh plugin --profile desktop add "file:<仓库所在路径>/dsh-plugin-session-delete"
dsh plugin 用的是桌面安装自带的那套运行时,它有权管理 desktop profile;npm 全局安装的 CLI 会拒绝针对 desktop 的启动与管理请求。
然后完全退出并重启 Harness。Bundle 的 patch 会把行插进 profile 树:
- insert:
- id: hitzhangjie-session-delete
name: '@hitzhangjie/dsh-plugin-session-delete'
行名必须是裸包名:dsh-client-modules 只把包的浏览器半区挂到「模块说明符正好是裸包名」的 Loader 行上,而 profile 解析层负责把裸包名解析到 profile 自己的 node_modules。写成相对路径(./lib/index.js)只会加载宿主半区,菜单项不会出现。
架构
| 半边 | 文件 | 作用 |
| Host | lib/index.js | 注册 loopback 精确路由 POST /api/hitzhangjie/session-delete,校验请求来源后执行整套删除。profile 插件没有 harness.handle / host.call 通道,所以浏览器半区用同源 fetch 调这个路由。 |
| Client | lib/client.js | 通过 window.__ModuleLoader__.load({ id, factory }) 注册工厂(bundle id 必须等于包名),往 sidebar.workspaces.session.menu.item 注册菜单项,渲染两步确认,调用宿主路由并刷新会话列表。 |
请求防护:精确路由在 webServer.match() 里优先于应用自己的 /api 前缀路由,因此这个 handler 自带守门——Sec-Fetch-Site 为 cross-site / same-site 一律拒绝;带 Origin 时必须是 loopback 主机且端口等于本进程 webServer.port;没有 Origin 与 Sec-Fetch-Site 的本机进程被接受(web server 只监听 loopback)。会话 id 另有一层严格字符白名单。
删除失败而非静默:not-found(会话不存在)、has-children(有子会话)、list-failed(读不到会话列表,失败关闭而不是假定没有子会话)、invalid-id、forbidden 都会以 409/403 返回结构化原因,界面直接显示。
开发
宿主半区冒烟测试:stub ctx + 临时 DSH_HOME,不碰真实会话
node test/host-smoke.mjs
- 宿主半区改动需要重启 Harness;浏览器半区改动 dsh-client-modules 按文件修订号重新服务,刷新页面即可。
- 浏览器半区是纯 JavaScript(无 JSX),只能 require 平台基线模块:react、@deepseek-ai/dsh-client-ui-primitives(Module Loader 包的隐式 external)。
已知边界
- 已经上报的遥测无法撤回,本插件只清理本地状态。
- 别的会话正文里提到该会话的文字属于别的会话,不动。
- 删掉父会话被拒绝,所以子会话 header 里的 parentSession 不会悬空;反过来,子会话被删掉后,父会话的分支记录仍保留。
- 正好处于「活的写句柄仍占文件」的极端时序下会走 deferred 路径:文件在下次启动时补删。
- 投影缓存路径假定默认 storage 根(<home>/storages);profile 把 storage 根搬到别处时,这一个缓存文件会留下(会话已经没了,没有读者)。
@hitzhangjie/dsh-plugin-session-delete(English)
DeepSeek Harness 只提供归档:归档后的会话永远留在磁盘上。本插件补上缺失的那一步——真正的、不可逆的会话删除——入口放在侧边栏会话行的 ... 菜单里。
它是一个 DSH bundle(声明了 dsh.bundle.patch),所以用 dsh plugin --profile <profile> add <path> 安装时会自动选为 profile 层,不需要手写 cordis.patch.yml 行。
功能。 往 sidebar.workspaces.session.menu.item 注册一行红色 Delete session…,展示方式与内置操作一样,都用 MenuItemButton;两步内联确认,五秒后自动解除;先通过归档的 stopActivity waterfall 停掉正在跑的工作;带 fork 子会话的会话会被拒绝(子会话 header 里写着父会话);本地状态清得干干净净——事件日志目录、投影缓存条目、spill 目录、workspace 记账、archive/pin 归属,以及 store 暴露 live store 条目时的那一条。文件仍被活的写句柄占着时,会记到 <home>/plugins/session-delete.pending.json,下次启动再补删。
安装,重启,完事。 行名必须是裸包名:dsh-client-modules 只把包的浏览器部分挂到 specifier 正好是裸包名的 Loader 行上,而 profile 解析会把该名字映射到 profile 自己的 node_modules。
防护。 精确路由优先于应用的 /api 前缀路由,所以它自己守门:Sec-Fetch-Site 为 cross-site / same-site 一律拒绝;带了 Origin 就必须是本进程 webServer.port 上的 loopback;会话 id 必须匹配严格的字符白名单。拒绝以结构化 JSON 返回(not-found、has-children、list-failed、invalid-id、forbidden),并显示在菜单里。
不装 harness 也能验证:node test/host-smoke.mjs 拿桩上下文和临时 DSH_HOME 跑 host 部分。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
hitzhangjie/dsh-plugin-session-delete
从侧栏永久删除会话并清理全部本地残留
相关插件 · 浏览器
智能体插件框架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
这是你的仓库?认领条目