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

会话回收站 xxiiiixx/dsh-session-trash

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

把会话移入回收站,可随时还原或永久清除

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/20 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add xxiiiixx/dsh-session-trash
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · browser
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 15 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 32 处,展示前 25 条)
  • 发起网络请求
    client.js:212
    response = await fetch(new URL(ENDPOINT, document.baseURI).href, {
  • 读取本地文件
    lib/trash.js:102
    await access(path, fsConstants.F_OK)
  • 读取本地文件
    lib/trash.js:197
    names = await readdir(trashRoot, { withFileTypes: true })
  • 读取本地文件
    lib/trash.js:220
    const info = await lstat(dir).catch(() => undefined)
  • 读取本地文件
    lib/trash.js:226
    manifest = JSON.parse(await readFile(join(dir, MANIFEST), 'utf8'))
  • 写入本地文件
    lib/trash.js:366
    await mkdir(trashRoot, { recursive: true }).catch((error) => {
  • 写入本地文件
    lib/trash.js:372
    await mkdir(entryDir, { recursive: false })
  • 写入本地文件
    lib/trash.js:385
    await mkdir(dirname(join(entryDir, slot)), { recursive: true })
  • 删除本地文件递归
    lib/trash.js:393
    await rm(entryDir, { recursive: true, force: true }).catch(() => undefined)
  • 删除本地文件递归
    lib/trash.js:425
    await rm(entryDir, { recursive: true, force: true }).catch(() => undefined)
  • 读取本地文件
    lib/trash.js:550
    const sourceInfo = await lstat(source).catch(() => undefined)
  • 读取本地文件
    lib/trash.js:575
    const childInfo = await lstat(childSource).catch(() => undefined)
  • 写入本地文件
    lib/trash.js:588
    await mkdir(projectDir, { recursive: true }).catch((error) => {
  • 写入本地文件
    lib/trash.js:592
    await mkdir(move.projectDir, { recursive: true }).catch((error) => {
  • 删除本地文件
    lib/trash.js:612
    await rm(join(dir, MANIFEST), { force: true }).catch((error) => warn('manifest cleanup failed', error))
  • 删除本地文件递归
    lib/trash.js:613
    await rm(join(dir, SESSIONS_DIR), { recursive: true, force: true }).catch(() => undefined)
  • 删除本地文件
    lib/trash.js:614
    await rmdir(dir).catch(() => undefined)
  • 删除本地文件递归
    lib/trash.js:634
    await rm(dir, { recursive: true, force: false }).catch((error) => {
  • 写入本地文件
    lib/trash.js:707
    await writeFile(temporary, content, 'utf8')
  • 读取本地文件
    lib/sessions.js:53
    const names = await readdir(dir)
  • 读取本地文件
    lib/sessions.js:76
    const stream = createReadStream(path, { encoding: 'utf8', highWaterMark: 16 * 1024 })
  • 读取本地文件
    lib/sessions.js:103
    const source = createReadStream(path, { highWaterMark: 16 * 1024 })
  • 读取本地文件
    lib/sessions.js:176
    projects = await readdir(sessionsRoot, { withFileTypes: true })
  • 读取本地文件
    lib/sessions.js:185
    info = await lstat(join(projectDir, segment))
  • 读取本地文件
    lib/sessions.js:190
    const resolvedProject = await realpath(projectDir).catch(() => undefined)
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

README

由 DeepSeek 最新模型翻译生成
dsh-session-trash DeepSeek Harness 桌面版会话回收站 —— 从侧边栏菜单把会话移入可还原的回收站,再在 设置 → 会话回收站 里还原或永久清除。 会话回收站图标 简介 Harness 会永久保留每一个会话日志。sessionPersistence 本身没有删除 API ("Nothing deletes session files"),工作区注册表只提供归档,日志仍留在磁盘上。 这个插件补上了缺失的能力,并把它做成最安全的形态:可还原的移动、 仅用户触发、任何文件路径都不经过网络传输。 目录 - 使用 - 配置 - 安全设计 - 作用范围 - 验证 - 更多 - 免责声明 - 已知限制 使用 | 位置 | 作用 | | 会话行 → …
展开完整文档(README 剩余 1 节)
dsh-session-trash

DeepSeek Harness 桌面版会话回收站 —— 从侧边栏菜单把会话移入可还原的回收站,再在 设置 → 会话回收站 里还原或永久清除。

会话回收站图标

简介

Harness 会永久保留每一个会话日志。sessionPersistence 本身没有删除 API ("Nothing deletes session files"),工作区注册表只提供归档,日志仍留在磁盘上。
这个插件补上了缺失的能力,并把它做成最安全的形态:可还原的移动、 仅用户触发、任何文件路径都不经过网络传输。

目录

- 使用
- 配置
- 安全设计
- 作用范围
- 验证
- 更多
- 免责声明
- 已知限制

使用

| 位置 | 作用 |
| 会话行 → … 菜单 | 移入回收站 —— 直接采用原生 MenuItemButton 的尺寸(高度、内边距、图标位、文字节奏)与危险配色 |
| 确认框 | 移动前显示标题、原路径与占用大小;确认键用原生“描边 + 红字”,取消键为描边 |
| 设置 → 会话回收站 | 列出已删除会话,可还原、永久清除、清空回收站 |
| Harness 启动时 | 静默清除超过 retentionDays(默认 30 天)的条目 |

删除动作是用一次 rename 移动会话目录到 $DSH_HOME/session-trash/<UTC 时间戳>-<会话 id>/,并在旁边写入 manifest.json。
全程不复制文件,所以中断不会留下“删了一半”的会话;移动失败时两个目录都保持原样。

安装

与其他插件完全一致的安装位置:

dsh plugin --profile desktop add github:xxiiiixx/dsh-session-trash

或用本地目录:在「设置 → 插件 → 添加」里指向该目录(或调用 plugin_manager 的 install_bundle)。插入的 Loader 行名为 dsh-session-trash,安装后立即启用。
如果 Plugin Manager 返回 restart-required,请重启 Harness。

更新已安装的版本

从 GitHub 安装是把包复制进 profile 的 node_modules,不会链接回源码目录。
所以只改维护目录里的代码不会生效,必须先推送、再替换已安装的副本。

cd <你的维护目录>
git add -A && git commit -m "..." && git push

然后让 Plugin Manager 重装这个 bundle(remove_bundle 之后 install_bundle 指向 github:xxiiiixx/dsh-session-trash,或在「设置 → 插件」里做同样两步)。
重装软件包后需要重启 Harness 才能加载新的 Host 端 JavaScript 代次;Client 端刷新页面即可。

如果你更希望改完立刻生效,就用目录路径安装——那会在 profile 里生成一个 junction 链接,此后一旦移动或重命名该目录,插件就会失效,因为链接仍指向旧位置。

配置

bundle patch 插入 Host 行时不带任何配置:插件在激活时从运行中的 DSH 主目录推导两个根目录,所以正常安装无需按机器改动。每个字段都可以在 profile 自己的 patch 层覆盖。

| 字段 | 默认值 | 含义 |
| sessionsRoot | $DSH_HOME/sessions | 会话日志所在根目录 |
| trashRoot | $DSH_HOME/session-trash | 已删除会话移入的目录,必须与 sessionsRoot 同卷 |
| retentionDays | 30 | 自动清理天数,0 表示关闭 |
| sweepOnStart | true | 每次 Host 启动执行一次清理 |
| maxTrashEntries | 500 | 超过该数量拒绝新删除,0 表示不限 |

- id: dsh-session-trash
name: 'dsh-session-trash'
config:
retentionDays: 90

安全设计

删除是破坏性操作,所以这个插件绝大部分代码用来“拒绝”,而不是用来“删除”。

1. 默认可还原。 删除是移动,不是 unlink;永久清除是回收站页面里另一个明确的动作。
2. 路径不经过网络。 客户端只发 { op, sessionId } 或 { op, trashId }; Host 用自己的根目录解析标识符,请求体里根本没有 path 字段可用。
3. 标识符白名单(^[A-Za-z0-9._-]+$、≤ 200 字符、不是 ./..),解析后再用 realpath + path.relative 断言在根目录内,符号链接和构造的 id 都无法越界。
4. 目录必须自证身份。 移动前读取日志首行 header,header.id 与请求的会话不一致即拒绝。
5. 只有正在进行的轮次会阻止删除。 判定口径与原生归档完全一致:只有该会话的 Agent status === 'running' 才算忙。仅仅还驻留在注册表里的空闲 Agent 不会 阻止删除——你已经停止的会话就该能删。若 Agent 接口无法报告状态,则按“正在运行” 处理:宁可直接拒绝,也不去猜一个可能仍在写入的日志。
6. 派生的 subagent 会话跟着父会话走,分叉不走。 origin: subagent 的会话只为父会话跑子任务,已停止的会移入同一个回收站条目,还原时一起回来;分叉(isSeeded)是从父会话历史播种后独立存在的会话,留在原地且不会阻塞父会话删除。
仍在运行的派生会话、或自身还有子会话的派生会话,会拒绝整个搬运并说明原因。
7. 只 rename,绝不“复制后删除”。 EXDEV/EPERM/EBUSY 直接回报 cross-volume / busy,不存在会留下副本或半个副本的兜底路径。
8. 变更串行化。 每个服务一条 promise 链,并在真正移动前重跑全部预检,压缩“对话框到执行”之间的窗口。
9. 不注册任何 agent 工具。 Host 半一个工具都不加,只有用户在界面上点击才能删除会话,模型无法调用。
10. 单一端点,走标准鉴权。 POST /api/session-trash 挂在 ctx.connection.fetch 上,继承 Harness 的 Host/Origin 与浏览器凭据校验;请求体上限 64 KiB、操作是封闭集合、错误只返回稳定 code 与固定文案,绝不泄露文件系统路径。
11. 日志才是事实来源。 删除只做两件旁路工作:把会话从 workspace 的 pin/archive 集合里去掉,并发出 api-session/removed —— 这正是侧边栏已经在监听的事件,所以列表行立即消失,不需要插件私有状态。

作用范围

- 允许:任何未运行、且其派生会话(若有)都已停止的会话。
- 拒绝:正在运行的会话或派生会话、自身还有子会话的派生会话、无法证明属于该会话的目录,以及配置根目录之外的任何路径。
- 不触碰:被删日志引用过的附件(附件存储全局共享且不可变),以及投影缓存行(它们只是提示,会自愈)。

验证

npm test # 65 项:路径、配置、回收站服务、HTTP 路由、Client bundle
npm run e2e # 通过 HTTP handler 走一遍完整流程
npm run audit # 对真实会话逐个给出只读判定
npm run check:css # 与宿主自身样式表逐条比对复制的规则
npm run check:liveness

测试会用真实的 Zstandard 日志搭建临时会话根,断言:只读预检、身份不符拒绝、运行中/派生会话拒绝、原子移动与回滚、manifest 往返、还原冲突、清除越界(../../etc 被拒绝)、损坏 manifest 处理、保留期清理、容量拒绝、并发串行化。
Client 套件会在桩化的模块加载器里真正执行 client.js,断言样式表在任何槽注册之前就已注入 —— 这正是曾让菜单行看起来像浏览器默认按钮的那个回归。

更多

- CHANGELOG —— 每个版本改了什么、为什么改。
- @deepseek-ai/dsh-session-persistence-jsonl —— 本插件读取与移动的磁盘布局。
- @deepseek-ai/dsh-workspace —— 删除后需要更新的 sessionIds 注册表。

免责声明

本插件会删除数据,请在安装前读完这一节。

- 删了什么由你负责。 插件会把会话日志移出 sessionsRoot,并可应你的要求永久清除。
你确认的那次删除,改变的是你自己的文件;作者不对会话丢失、历史丢失或无法重建的工作承担责任。第一次使用前,请先备份任何不能承受丢失的内容。
- 按“原样”提供,不附带任何担保。 本软件以 MIT 许可证发布,该许可证按“原样” 提供软件,不附带任何明示或暗示的担保,并免除因使用本软件所生损害的责任。
以 LICENSE 的条文为准。
- 与 DeepSeek 无隶属关系。 这是独立的第三方插件,未获得 DeepSeek 的认可、赞助或支持。DeepSeek Harness 及其标识归各自所有者所有,此处提及只是为了说明本插件与什么协同工作。
- 它依赖可能变化的内部实现。 插件读取自带 JSONL 后端的磁盘布局,并以复制样式的方式依赖宿主自己的菜单组件。Harness 升级可能改动其中任何一处,插件届时可能不再正常工作。
在把它用于重要数据之前,先拿一个你丢得起的会话验证一遍。
- 移动可能被拒绝或中途失败。 插件会返回 cross-volume、busy、live、 has-children 等错误码,而不是硬删;搬运中途失败会把已移动的部分放回。被拒绝是安全的结果,不是缺陷——请不要靠手工改文件去绕过它。
- 只有人能删除。 插件不注册任何 agent 工具。如果某个会话被删了,那是有人点了按钮,责任也在那个人。
- 不承诺支持。 欢迎提 Issue 和 PR,但不承诺响应时间、修复时限或持续维护。

已知限制

- 本地目录安装没有构建步骤。 两半都是纯 JavaScript,所以目录安装直接加载。
改动 Client 刷新页面即可;改动 Host 需要重载插件或重启 Harness,因为 Node 按进程缓存 ES 模块。
- 会话是在 $DSH_HOME/sessions/<项目>/ 下按编码后的 id 匹配的,这正是自带 JSONL 后端的布局;换成别的持久化后端需要另写定位逻辑。
- 回收站不能跨卷:trashRoot 必须与 sessionsRoot 同卷。默认两者都在 $DSH_HOME 下,所以只有手动挪动其中一个时才会遇到。

许可证

MIT,见 LICENSE。
预览分享卡片长什么样 ↓xxiiiixx/dsh-session-trash
分享 · DeepSeek Harness Hub
xxiiiixx/dsh-session-trash

把会话移入回收站,可随时还原或永久清除

这是你的仓库?认领条目

回到顶部