dsh-session-menu-delete:侧栏会话菜单里的「删除会话」

前言

DeepSeek Harness(DSH)侧栏会话行「⋯」菜单里,原生提供置顶、重命名、分叉、归档,但没有把会话从磁盘上彻底移除的入口。归档只会改变列表状态,会话工件、投影缓存和工作区账本里的归属仍在;子代理会话又是与父会话平级落盘的独立工件,只删父会话会留下侧栏里仍可见的孤儿行。下面介绍社区插件 dsh-session-menu-delete(维护者 Nay-1,分类:客户端):在菜单里补一项「删除会话」,并按 DSH 服务边界做级联清理与 fork 保护。

这是什么

dsh-session-menu-delete 通过 Cordis 插槽 sidebar.workspaces.session.menu.item 注册菜单项,紧跟内置「归档会话」(内置 order 400)之后,本项 order 为 500;图标使用 primitives 的 IconTrashOutlineRegular,并以 danger: true 渲染为红色破坏性操作。

DSH 原生侧栏只有归档、没有删除;本插件补上删除能力,并在 host 侧连带清理子代理会话(避免孤儿),同时不删除用户 fork 出来的副本会话。

  • 目录页:https://www.skillhub.cn/plugins/Nay-1/dsh-session-menu-delete
  • 源码与说明:https://github.com/Nay-1/dsh-session-menu-delete
  • 许可证:MIT(见仓库 package.json)

核心功能

菜单与交互

点击「删除会话」没有二次确认,client 半会请求 POST /session-menu-delete/api/delete,由 host 半按顺序处理磁盘与内存状态。

删除当前正在主视图里打开的会话时,插件不会自动切换工作区或清空主视图:界面会停在已删会话上,表现为「会话不可用」,直到你手动点侧栏其它会话或「新会话」。这是有意设计——删除不应顺带改变你正在看的内容;早期自动 startSession / clearMain 的逻辑已从 client 半移除。

删除范围(host 侧)

host 半大致会处理以下项(会话仍在运行时先按 DSH 顺序 dispose agent,带超时,任一步超时会中止整个删除):

  1. 会话工件目录 <DSH_HOME>/sessions/<slug>/<sessionId>/
  2. 投影缓存 <DSH_HOME>/storages/session_projcache/sessions/<id>.json
  3. 工作区账本:通过 workspaceRegistry 的 entity.detachSession(),而非直接改 workspace.json
  4. 归档 / 置顶集合中的该 id
  5. 派生出的子代理会话(级联,见下)
  6. 仅被本次删除集合引用的图片类附件对象(可关闭,见下)

全部操作不可恢复,没有回收站。

摘 agent 时插件会补发与 DSH 形状一致的 agent/disposed 事件,避免下游模块因 detach 边未发出而长期收不到 disposed 信号。

级联:只链子代理,不碰 fork

子代理会话 header 含 origin: "subagent" 与 parentSession;fork 出来的副本也有 parentSession,但没有 origin 标记,因此不会进入血缘图。删除父会话时:

  • 子代理(含多层 delegation)会先删后代、再删目标;
  • fork 副本及其子树一律保留,内容自包含(历史以 seed 写入新工件)。

若只想删目标、不级联子代理,请求体可传 {"cascade": false}。删除前可用只读接口查看后代:

GET /session-menu-delete/api/lineage?sessionId=<id>

附件清理(速览)

图片类持久对象在 <DSH_HOME>/attachments/v1/objects/<前2位>/<sha256>;cache/attachments/request-images/ 等为 DSH 请求缓存,与本插件无关。attachments/v1/file-objects/ 与 attachments/v1/files/ 本插件不清理。

默认在删会话时「顺手」清理:仅当某附件的全部引用者都落在本次被删集合(含级联子代理)内时才删对象;被 fork 或其它会话共享的不动。关闭顺手清理:{"attachments": false}。

全库孤儿清理走 POST /session-menu-delete/api/attachments/clean(需 confirm);判据同时扫描活会话内存事件(ownEvents())与磁盘日志,避免「刚看过图、引用尚未落盘」时被误判为孤儿。机制细节见仓库 ATTACHMENT-CLEANUP.md。

调用插件 HTTP 端点时需带头 x-dsh-plugin-call: 1(README 中 PowerShell 示例以此为准)。

安装与启用

把仓库放到本地任意目录后,用该目录的绝对路径安装(勿凭插件名拼接 github:owner/repo):

dsh plugin --profile desktop add "file:<本仓库所在目录的绝对路径>"

dsh plugin --profile <name> 会把参数转发给 pnpm 管理依赖。

装完后须让 DSH 加载插件,二选一:

  • 在 DSH「插件」页面启用(会写入 dsh.profile.bundles);
  • 或手工把 "dsh-session-menu-delete" 加入 ~/.dsh/profiles/desktop/package.json 的 dsh.profile.bundles 数组。

修改 lib/client.js 可热更新;修改 host 半通常需重启 DSH 进程(README 对两半生效方式有对照表,此处从略)。

运行环境:package.json 要求 Node ^22.15.0 || >=24.0.0,peer 依赖 cordis >=4.0.0-rc <5。

典型用法

侧栏删除

  1. 在侧栏目标会话行打开「⋯」菜单。
  2. 点击「删除会话」(归档下方、红色垃圾桶项)。
  3. 若删的是当前主视图会话,自行切换到其它会话或点「新会话」。

预览附件孤儿并清理(HTTP)

以下示例来自 README(默认插件 HTTP 端口以你本机 DSH 为准,示例为 127.0.0.1:19387):

$h = @{ "x-dsh-plugin-call" = "1" }

# 只读预览孤儿
Invoke-RestMethod "http://127.0.0.1:19387/session-menu-delete/api/attachments/orphans" -Headers $h | ConvertTo-Json -Depth 5

# 确认后删除(不带 confirm 同样只预览)
Invoke-RestMethod -Method Post "http://127.0.0.1:19387/session-menu-delete/api/attachments/clean" `
  -Headers $h -ContentType "application/json" -Body '{"confirm":true}' | ConvertTo-Json -Depth 5

适用场景与注意

适合谁:需要在 DSH 桌面侧栏直接彻底删除会话、并希望子代理一并清理、fork 副本保留的开发者;能接受「点击即删、无确认框」的操作习惯。

权限与安全:插件在 DSH 进程权限下读写 DSH_HOME 与会话工件,安装前请自行审阅源码与 MIT 许可证,确认符合你的数据保留策略。社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系。

生态背景:DSH 采用「一切皆插件」扩展方式;本插件属于客户端注入类(dsh.client.inject 含 @deepseek-ai/dsh-client-ui-slots),与 host 半协同完成删除与清理。

结尾

dsh-session-menu-delete 把侧栏缺失的「删除会话」补全,并在 host 侧按 DSH 服务边界清理工件、投影、账本与子代理,同时保护 fork 会话与共享附件。需要进一步了解菜单顺序、dispose 顺序与附件判据时,以 GitHub README 与 ATTACHMENT-CLEANUP.md 为准。

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

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

Xiaoye