@hitzhangjie/dsh-plugin-session-delete:侧栏永久删除会话

前言

在 DeepSeek Harness(DSH)里,内置能力只提供「归档」:归档后的会话仍会留在磁盘上,事件日志、投影缓存、工作区记账等本地状态不会自动清掉。做长期开发或反复 fork 试验时,侧栏和存储里会堆满不再需要的会话,只靠归档无法真正回收空间,也无法从列表里彻底移除一条记录。

社区插件 @hitzhangjie/dsh-plugin-session-delete(维护者 hitzhangjie,分类:客户端)补上这一步:在侧栏会话行 ... 菜单里提供不可逆的「删除会话」,先停活、校验 fork 血缘,再按顺序清理各层本地存储。下文介绍其定位、能力与安装方式;事实以 GitHub 仓库 README 为准。

这是什么

@hitzhangjie/dsh-plugin-session-delete 是声明了 dsh.bundle.patch 的 DSH bundle。用 dsh plugin --profile <profile> add <path> 安装后,patch 会自动选入 profile 层,一般不需要手写 cordis.patch.yml 行。

包版本为 0.1.0(见 package.json),许可证 MIT,要求 Node.js >= 20。它在宿主侧注册 loopback 删除 API,在浏览器半区往 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,下次启动(此时会话均为冷)自动补删,避免留下半成品目录。

请求防护与明确失败

宿主半区在 lib/index.js 注册精确路由 POST /api/hitzhangjie/session-delete;profile 插件没有 harness.handle / host.call 通道,浏览器半区用同源 fetch 调用该路由。

路由在 webServer.match() 里优先于应用自己的 /api 前缀路由:Sec-Fetch-Site 为 cross-site / same-site 一律拒绝;带 Origin 时须为 loopback 主机且端口等于本进程 webServer.port;无 Origin 与 Sec-Fetch-Site 的本机进程可接受。会话 id 另有严格字符白名单。

not-found、has-children、list-failed、invalid-id、forbidden 等会以 409/403 返回结构化原因,界面直接显示,不静默失败。

安装与启用

安装使用桌面版 Harness 自带的 dsh plugin 运行时;npm 全局安装的 CLI 会拒绝针对 desktop profile 的启动与管理请求。桌面版 Harness 固定使用保留 profile desktop。

# 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"

将 <仓库所在路径> 换成本机 clone 后的实际路径。然后完全退出并重启 Harness。Bundle 的 patch 会在 profile 树中插入类似下面的行:

- insert:
    - id: hitzhangjie-session-delete
      name: '@hitzhangjie/dsh-plugin-session-delete'

README 强调:行名必须是裸包名 @hitzhangjie/dsh-plugin-session-delete。dsh-client-modules 只把包的浏览器半区挂到「模块说明符正好是裸包名」的 Loader 行上;profile 解析层把裸包名映射到 profile 自己的 node_modules。若写成相对路径(例如 ./lib/index.js),只会加载宿主半区,侧栏菜单项不会出现。

插件以当前 DSH 进程权限在本地执行删除与文件清理;安装前请自行阅读仓库源码与 MIT 许可证,确认符合你的安全与合规要求。

典型用法

无需额外配置项。重启 Harness 后,在侧栏打开目标会话所在工作区,点该会话行右侧 ...,选择「删除会话…」,按两步确认完成永久删除。

若需在不启动完整 Harness 的情况下验证宿主半区逻辑,可在仓库根目录执行:

node test/host-smoke.mjs

该脚本使用 stub ctx 与临时 DSH_HOME,不触碰真实会话。宿主半区改动需重启 Harness;浏览器半区(lib/client.js)改动后,dsh-client-modules 按文件修订号重新服务,刷新页面即可。

适用场景与注意

适合谁: 需要在本地彻底移除试验会话、fork 分支或归档后仍占磁盘的会话,且接受不可恢复删除的 DSH 桌面用户。

边界(README 已知限制):

  • 已上报的遥测无法撤回,插件只清理本地状态。
  • 其他会话正文里提到该会话的文字属于其他会话,不会修改。
  • 删除父会话会被拒绝;子会话删除后,父会话的分支记录仍保留。
  • 投影缓存路径假定默认 storage 根 <home>/storages;若 profile 把 storage 根迁到别处,对应投影缓存文件可能残留(会话已删,无读者)。

DSH 生态理念是「一切皆插件」;SkillHub 目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系,本文不构成官方背书。

结尾

Harness 默认只归档、不删盘;@hitzhangjie/dsh-plugin-session-delete 在侧栏补上「停活 → 校验 → 清存储 → 刷新列表」的完整删除路径,并处理写句柄占用时的下次启动补删。需要时可从目录页或 GitHub 获取源码与更新:

  • 目录页:https://www.skillhub.cn/plugins/hitzhangjie/dsh-plugin-session-delete
  • GitHub:https://github.com/hitzhangjie/dsh-plugin-session-delete
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜