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

会话彻底删除 hitzhangjie/dsh-plugin-session-delete

DeepSeek Harness
hitzhangjie19 天前有提交已提供中文文档扫描:含敏感能力

从侧栏永久删除会话并清理全部本地残留

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
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 19 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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
预览分享卡片长什么样 ↓hitzhangjie/dsh-plugin-session-delete
分享 · DeepSeek Harness Hub
hitzhangjie/dsh-plugin-session-delete

从侧栏永久删除会话并清理全部本地残留

这是你的仓库?认领条目

回到顶部