DeepSeek Harness Hub
← 返回列表

Geralt4/dsh-plugin-session-delete

DeepSeek Harnessspec-screened在 GitHub 查看 ↗
未验证

一个 DeepSeek Harness 插件,为 Web UI…

尚未跑自动兼容性验证,可查看页面内的依赖与入口分析。 · 最近上游提交 2026/8/18 · 已提供中文文档

DSH 插件:从 Web UI 中永久删除会话的磁盘日志和附件(标题栏按钮 + 确认对话框)。

综合分
28.3
GitHub 分
28.3
用户评分
★ Stars
2
周下载量
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add Geralt4/dsh-plugin-session-delete
该插件未发布到 npm,走 GitHub 源安装(pnpm 若拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑)
数据截至 2026/9/19(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-slots
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

dsh-plugin-session-delete

一个 DeepSeek Harness 插件,为 Web UI 中的会话(聊天)添加真正的、永久性的删除功能——在对话头部添加一个“删除会话”按钮,并附带确认对话框。确认后,它会删除该会话在磁盘上的对话日志和附件,并将该行从侧边栏中隐藏,无需刷新页面。

目前,原生 UI 只能归档会话(将其隐藏;日志会永久保留在磁盘上)。核心没有 deleteSession RPC,因此该插件添加了一个小型的宿主端 HTTP 路由来执行持久删除,并添加了一个调用它的客户端头部操作。

⚠️ 不可逆。已删除的会话无法恢复。删除会话前,请停止该会话上正在运行的任何 agent(该路由也会尽力取消 agent)。适用于 Web 配置文件和桌面客户端。

安装

安装到 dsh web 配置文件中(dsh plugin 命令会转发到配置文件目录中的 pnpm),然后添加 Loader 条目行并重启配置文件:

从 npm 安装
dsh plugin --profile web add dsh-plugin-session-delete

或直接从 GitHub 安装(lib/ 已提交,因此无需构建)
dsh plugin --profile web add github:Geralt4/dsh-plugin-session-delete

然后将该插件的 Loader 条目追加到配置文件的 cordis.patch.yml($DSH_HOME/profiles/web/cordis.patch.yml)中,并重启 dsh web:

- insert:
- id: session-delete
name: dsh-plugin-session-delete

刷新页面后,对话头部会出现一个删除会话按钮。

工作原理

┌──────────────── browser ────────────────┐    ┌──────── host (Node) ────────┐
│ conversation.session.header.actions slot│    │ webServer.register(exact)   │
│   DeleteSessionHeaderAction (button)    │──> │   POST /api/session-delete  │
│   DeleteSessionDialog (confirm modal)   │    │     { sessionId }           │
│        │ confirm()                       │    │        │                    │
│        │ fetch POST /api/session-delete   │    │        ▼                    │
│        ▼                                 │    │ cancel agent (best-effort)  │
│   on ok: ctx.workspaces.archiveSession() │    │ sessionPersistence.inspect  │
│   (row disappears from sidebar now)     │    │   → absolute log path       │
└─────────────────────────────────────────┘    │ fs.rm(dir, recursive)        │
│   (log + attachments)        │
│ SQLite FTS rows auto-drop on │
│ next persistence observation │
└─────────────────────────────┘

为什么是插件而不是核心 PR

DeepSeek Harness 核心没有 session.delete / workspace.deleteSession RPC(只有 workspace.archiveSession,用于隐藏;以及 session.cancel,用于停止)。dsh-host-apiproxy 中的静态 UNARY_ROUTES 表无法由插件扩展,因此插件无法添加路由 RPC。但它可以,
通过 webServer 服务(dsh-host-webserver)注册自己的 HTTP 路由,并通过公开的 sessionPersistence.inspect(id).path 访问相同的磁盘结果。这个插件正是这样做的。

这是对真正应属于核心的功能(持久化协调器负责实时会话退役和精确路径编码)的尽力近似。如果维护者将来添加了一等的 deleteSession,这个插件可以缩减为围绕它的薄 UI 包装。

项目布局

dsh-plugin-session-delete/
package.json          # dsh.client manifest + peerDeps + tsdown scripts
tsdown.config.ts      # two-entry build (host + client)
tsconfig.json
src/
index.ts            # host half: webServer route + fs.rm
client.ts           # browser half: header action + confirm dialog
lib/                  # build output (index.js + client.js)

构建

pnpm install
pnpm bundle        # tsdown -> lib/index.js, lib/client.js (+ .d.ts)

客户端 bundle 格式说明

浏览器通过 window.__ModuleLoader__.load({ id, factory }) 加载客户端部分(参见 @deepseek-ai/dsh-client-modules)。在 DSH monorepo 中,一个共享的 tsdown 插件将客户端入口包装成该形式;宿主入口是纯 ESM,构建时保持不变。

- 在仓库内(首次开发推荐):将此包放到 packages/ 下(例如 packages/plugin/session-delete),并复制 packages/session-query/session-log-export/tsdown.config.ts,以便客户端输出被包装。将该包添加到 web profile 的 bundle 列表中。
- 在仓库外:要么复制该仓库内的 tsdown 配置,要么直接以 factory 形式编写 src/client.ts,以便普通的外部化构建可以加载(参见下面的 Out-of-tree build)。tsdown.config.ts 中的 peer deps 必须保持外部化,以便加载器的 require 在运行时解析它们。

安装到 profile

仓库外插件通过 dsh plugin 命令添加到 profile,该命令会转发到 profile 目录中的 pnpm:

from a checkout of this plugin, or an npm tarball
dsh plugin --profile web add
dsh plugin --profile web install

然后重新构建 profile 的前端产物并刷新正在运行的 URL(shell 不是独立应用;dsh web 会注入 window.__DSH_BOOT__)。

要针对运行在 http://127.0.0.1:3080 的 GUI 进行开发:客户端部分无需刷新即可重新加载,仅当同时从同一 checkout 运行 pnpm run dev:web 以重新构建客户端 bundle 时。宿主部分和 shell 需要重新构建 + 刷新。

运行 / 验证

1. 启动 web profile:dsh web(或从源代码 checkout 运行 pnpm dsh web)。
2. 打开一个会话。对话标题栏中会出现一个“Delete session”按钮。
3. 点击它 → 确认对话框 → “Delete permanently”。
4. 该会话在持久化根目录下的磁盘目录被删除,该行从侧边栏中消失。

磁盘上的会话日志位于
///session.jsonl[.zstd]
(+ 同目录下的附件)。此插件从不重新计算该路径:它从
sessionPersistence.inspect(id) 读取绝对路径,并删除该
产物的目录。

树外构建(客户端工厂形式)

如果你无法使用仓库内的 tsdown 客户端插件,请将 src/client.ts
替换为工厂形式的等价实现,以便一个普通的外部化 ESM 构建可被加载。
其形态如下(与已发布的 @deepseek-ai/dsh-session-log-export/lib/client.js 一致):

window.__ModuleLoader__.load({
id: "dsh-plugin-session-delete",
factory: (require) => {
const { jsx, jsxs, Fragment } = require("react/jsx-runtime");
const { createSnapshotStore } = require("@deepseek-ai/dsh-client-runtime/client");
const { Modal, Button, IconTrashOutline16 } = require("@deepseek-ai/dsh-client-ui-primitives");
// …the controller, dialog, header action, and apply/inject from src/client.ts…
return { apply, inject };
},
});

在 tsdown.config.ts 中保持 react、react/jsx-runtime 和 @deepseek-ai/* 为外部依赖,
以便这些 require(...) 调用在物化时由加载器解析,而不是被打包。

限制

- 活动会话:如果某个 agent 在你删除时正在积极写入,
持久化协调器可能会在此插件删除日志后重新创建它。
该路由会尽力先取消该 agent;对话框会警告用户。
- 后代:此 v1 仅删除一个会话的目录。子 agent
子项不会被级联删除。(如果你想要级联的后续功能,请查看 session.export 的 includeDescendants
模式。)
- 工作区记账:该行通过 workspace.archiveSession 被隐藏,
这会将该 id 保留在其工作区的 sessionIds 槽位中。过期的记账
会在下一次持久化观察时由核心协调。从记账中真正移除
应属于核心的职责。
- SQLite FTS 索引:一旦日志文件消失,会由核心的协调自动删除;
此插件不会直接触碰该索引。

许可证

MIT

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群