dsh-session-trash

DSH PLUGIN工具与能力

仓库 LazyRa/dsh-session-trash

工具与能力 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

dsh-session-trash 是 LazyRa 维护的 工具与能力 类 DSH 可安装插件, 仓库为 LazyRa/dsh-session-trash,许可证 MIT。 下面按「装什么、怎么装、验没验过、跑起来要注意什么」逐项列出。

一句话选型结论

按资料字段整理

dsh-session-trash 是工具与能力类的 DSH 可安装插件,验证等级 L5 · 运行验证通过,安全审查为低风险,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类工具与能力 收录类型可安装插件 验证等级L5 · 运行验证通过 安全审查低风险
验证等级 L5 L5 · 运行验证通过
GitHub 星标 1 复刻 0 · 未关闭 issue 0
最近更新 2026-10-23 创建于 2026-10-19
README 15.0 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add @lazyra/dsh-session-trash
  1. 1
    确认版本与运行环境

    仓库没有标注兼容版本与 Node.js 要求,先确认你的 DSH 版本能装,再继续。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本未标注版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

工具与能力
字段来自项目仓库与公开索引,中文说明由本站标注

适用场景

文件读写存储

上游标签

cordisdeepseek-harnessdshdsh-pluginpluginrecycle-binsession-managementtrash

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L5:安装和运行都在沙盒里跑通过,装完能直接用的概率高。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在工具与能力场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-session-trash当前 L5 · 运行验证通过 低风险 1 未标注 有
loopx 未做沙盒验证 未标注 6,233 未标注 无
dsh-startup-screen 未做沙盒验证 未标注 633 未标注 有
minara-skills L4 · 沙盒安装通过 中风险 360 未标注 有
dsh-blender-plugin 未做沙盒验证 未标注 211 未标注 无
tokenledger L5 · 运行验证通过 低风险 204 0.2.0-rc.2 等 11 个 有

仓库档案

工具与能力
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方LazyRa仓库 dsh-session-trash · 默认分支 main
分类工具与能力tools
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言未标注仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue1 / 0 / 0收录时的数值,非实时
创建 / 更新2026-10-19 · 2026-10-23最后推送 2026-10-23
本站收录2026-10-30首次进入本站目录的时间

README 全文

15.0 KB
作者原文,中文版优先;只做安全转义,不改内容

🗑️ dsh-session-trash

给 DeepSeek Harness 补上「可恢复的会话删除」

删错了?7 天内随时找回来。







快速开始 · 功能 · 使用 · 配置 · 工作原理 · 常见问题 · 开发


为什么需要它

DSH 官方只有归档(archive)——归档是把会话藏起来,可以反悔;但删除这个动作官方没有提供。

你可能遇到过这些情况:

  • 会话列表越堆越长,想清理掉不用的
  • 手滑点错,把还要用的会话处理掉了
  • 想彻底删掉某些内容,却只能归档,数据还占着磁盘

这个插件把「删除」做成安全版本:不是抹掉,而是移进回收站。7 天内随时恢复,到期自动清理。

❌ 没有它

会话太多 → 只能归档
误操作   → 无法挽回
想清理   → 数据一直占着

✅ 有它之后

会话太多 → 删除,进回收站
误操作   → 6 秒内点撤销
想清理   → 彻底删除,释放空间

✨ 功能

功能 说明
🗑️ 删除即入回收站 会话目录被移动而非删除,数据零风险
↩️ 6 秒内撤销 删除后顶部提示条,一键反悔,不用去回收站翻
📅 7 天保留期 期间随时恢复,到期自动清理(启动时 + 每 6 小时)
🔍 回收站页面 搜索标题/路径、按时间/大小/名称排序、显示占用
🎯 完整恢复 回到原工作区、原位置,标题、排序、置顶状态都保留
⚡ 即时刷新 接入 DSH 事件链路,删完侧栏立刻消失,不用手动刷新
⌨️ 快捷键 Ctrl/Cmd + Shift + Delete 删除当前会话
🛡️ 运行中保护 会话还在跑时先询问,不会悄悄打断工作
🌏 中英双语 跟随 DSH 语言设置

🚀 快速开始

> ✅ 已发布到 npm:@lazyra/dsh-session-trash,
> 并已完成安装验证 —— 从 npm 装好后 DSH 正常启动,删除、撤销、回收站均可正常使用。

方式一:插件管理器(推荐)

  1. 侧栏点击 插件
  2. 点击 添加插件
  3. 输入 @lazyra/dsh-session-trash
  4. 安装 → 启用 → 重启 DSH

方式二:命令行

dsh plugin --profile desktop add @lazyra/dsh-session-trash

方式三:从源码安装

git clone https://github.com/LazyRa/dsh-session-trash.git
dsh plugin --profile desktop add /path/to/dsh-session-trash

> [!TIP]
> 安装后需要重启 DSH 才会生效。如果侧栏没出现「回收站」,检查插件是否已启用。

升级到新版本

pnpm 默认带 minimumReleaseAge —— 发布不满 24 小时的包会被静默跳过。
所以插件发新版后,pnpm update 可能悄悄停在旧版本,看起来像没生效。

在 profile 的 pnpm-workspace.yaml 里放行一次即可:

minimumReleaseAgeExclude:
- '@lazyra/dsh-session-trash@0.1.1 || 0.1.2'

然后:

pnpm update @lazyra/dsh-session-trash --latest

确认版本:

node -e "console.log(require('./node_modules/@lazyra/dsh-session-trash/package.json').version)"

> 之后每次发新版,把新的版本号补进 || 后面即可。

📖 使用

删除会话

侧栏会话行 → 悬停显示 ⋯ → 删除会话

删完立刻可撤销:

管理回收站

侧栏 回收站 进入管理页面:

操作 说明
恢复 会话回到原工作区和原位置
彻底删除 永久删除,不可撤销
全部删除 清空回收站
搜索 按标题或路径过滤
排序 按删除时间 / 大小 / 名称
刷新 手动重新读取(正常情况无需点击)

彻底删除有二次确认,使用 DSH 原生对话框样式:

快捷键

快捷键 功能
Ctrl/Cmd + Shift + Delete 删除当前打开的会话

⚙️ 配置

在 profile 的 cordis.patch.yml 中给插件加 config:

- id: dsh-session-trash
name: "@lazyra/dsh-session-trash"
config:
retentionDays: 7          # 会话保留天数,默认 7
sweepIntervalMs: 21600000 # 自动清理间隔(毫秒),默认 6 小时
home: null                # DSH home 路径,默认读 $DSH_HOME 或 ~/.dsh
配置项 类型 默认值 说明
retentionDays number 7 回收站保留天数,到期后自动彻底删除
sweepIntervalMs number 21600000 过期扫描间隔,60000 毫秒起
home string \| null null DSH home,留空则自动推断

🔬 工作原理

数据怎么存

/
├── sessions/
│   └── //
│       └── session.v4.jsonl.zstd        ← 会话原始位置
│
└── trash/
└── 2026-10-19T09-19-52-123-session-xxxx/
├── meta.json                     ← 原位置、标题、删除时间
├── session.v4.jsonl.zstd         ← 会话本体
└── projcache.json                ← 投影缓存(含标题)

删除 = 把整个目录 rename 到 trash/。恢复 = 反向搬回。没有任何数据被删改。

三处状态必须同步

只移动目录是不够的 —— 不同步注册表就会留下「幽灵会话」:

位置 处理 不同步的后果
sessions/// 移动到 trash/ 会话仍出现在侧栏
storages/workspace.json 移出成员集合,保留在归档集合里 会话掉进「未分组」(见下)
storages/session_projcache/ 一并移入回收站 恢复后标题丢失

为什么被删的会话必须「留在归档集合里」

这是本插件最容易踩空的一处,也是「删完的会话又出现在未分组」的原因。

DSH 的会话语料是「落盘 ∪ 活会话」:

// session-query/src/corpus.ts
const persisted = await listPersisted(persistence, signal)   // 磁盘上的会话
for (const session of this._ctx.sessions.list()) {            // 内存里活着的会话
records.set(session.id, { ... })
}

把目录移进回收站只清掉了「落盘」那一半。只要会话还活在 ctx.sessions 里
(挂着 agent 的会话会一直活到它的生命周期结束),下一次拉取列表它就会回来;
而插件已经把它移出了工作区,于是客户端把它归到「未分组」:

// ui-workspace/src/client/tree.ts
const stray = list.ids.filter((s) => !accounted.has(s.id) && sessionVisible(...))
//                                              ↑ 不属于任何工作区 → 未分组

客户端判定可见性的官方口径是归档集合:

// ui-workspace/src/client/tree.ts
case 'default': return !archived.has(session.id)

所以插件在删除时做的是 archive + detach:归档(隐藏)+ 摘掉工作区成员关系,
并保持归档状态不变;直到恢复时才 unarchiveSession 撤销归档。

> 早先的实现是在删除时把会话从归档集合里摘掉的,那正好等于「让它重新可见」——
> 于是被删的会话在下一轮列表同步后回到「未分组」。

界面为什么能即时刷新

不靠轮询,走 DSH 自己的事件链路:

sequenceDiagram
participant UI as 侧栏/面板
participant Host as Host 插件
participant FS as 文件系统
participant Reg as workspaceRegistry

UI->>Host: POST /move
Host->>Reg: archiveSession(隐藏会话 + 活动准入)
Host->>FS: rename 到 trash/
Host->>Reg: detachSession(摘出工作区)
Host-->>UI: api-session/removed
Note over UI: 该行立即消失

UI->>Host: POST /restore
Host->>FS: rename 回原位
Host->>Reg: attachSession + unarchiveSession
Host-->>UI: api-session/added (含标题投影)
Note over UI: 该行立即出现,标题正确

运行中的会话怎么拦

用 DSH 官方的 workspace/session-activity waterfall 做准入检查,家族有
turn(Agent 正在跑)、job(后台任务)、subagent(子会话)。
有活动且用户没确认「停止并删除」时,删除会被拒绝并弹确认框;
确认后走官方 workspace/session-stop 停止工作。

为什么不能用 sessions.refresh()

恢复后如果调客户端 refresh() 整体重拉列表,会和 api-session/removed 写入的本地移除标记冲突,导致已永久删除的会话被重新捞出来、掉进「未分组」。所以恢复必须发带完整 summary 的 api-session/added。

> 顺带一提:客户端的移除标记只活在当前那一轮拉取里。下一轮拉取会新建一个空的
> 突变数组,旧的移除记录就丢了 —— 所以真正的修复必须落在服务端(归档),
> 不能只靠一条通知。

附件不参与回收站

attachments/v1/objects/ 是 SHA-256 内容寻址存储 —— 多个会话可能引用同一个对象。删除会破坏其他会话的历史,所以附件始终保留。

🔌 HTTP 接口

挂在 /api/dsh-session-trash/ 下,全部为精确路由(DSH 的 /api 只认精确路径,前缀路由会被 404)。

方法 路径 请求体 说明
POST list — 回收站条目 + 保留天数
POST probe { sessionId } 预检:会话是否仍在运行
POST move { sessionId, title?, stopActivity? } 移入回收站
POST restore { dir } 恢复
POST purge { dir } 彻底删除单条
POST purge-all — 清空回收站
POST sweep — 立即清理过期条目

❓ 常见问题

删掉的会话还能找回来吗?

能。7 天内都可以从回收站恢复,也可以点删除后顶部提示条的「撤销」立即恢复。

7 天后真的会删掉吗?

会。插件在 DSH 启动时扫一次,之后每 6 小时扫一次,把过期条目彻底删除。想保留更久可以调大 retentionDays。

删除会话会影响其他会话吗?

不会。每个会话的目录独立,附件是共享的但不会被删除。

会话正在运行时点删除会怎样?

会先检测到它在运行,弹出确认框询问是否停止后再删除。不会悄悄打断你的工作。

升级 DSH 后插件会失效吗?

插件会探测会话日志的实际格式版本(session.v.jsonl.zstd),不写死版本号。但如果 DSH 引入全新的存储结构,可能需要更新插件。

数据存在哪里?可以手动备份吗?

回收站在 /trash/ 下,每个条目是一个独立目录,直接复制走就行。

装了新版却没生效?

多半是 pnpm 的 minimumReleaseAge 把新版本跳过了(发布不满 24 小时会被静默拒绝)。
在 profile 的 pnpm-workspace.yaml 里加一行放行:

minimumReleaseAgeExclude:
- '@lazyra/dsh-session-trash@0.1.1 || 0.1.2'

然后 pnpm update @lazyra/dsh-session-trash --latest 并重启 DSH。详见升级到新版本。

删掉的会话又出现在「未分组」里?

那是 0.1.2 之前的旧版本的行为:插件只把会话目录移进回收站,没让 DSH 彻底不再列出它,
下一次拉列表时它就回来了(又不属于任何工作区,于是归到「未分组」)。

0.1.2 起删除时会把会话留在归档集合里(DSH 判定会话不可见的官方机制),恢复时才撤销。
升级到 0.1.2 即可。

🧑‍💻 开发

git clone https://github.com/LazyRa/dsh-session-trash.git
cd dsh-session-trash
npm test

纯 ESM,零构建 —— lib/*.js 就是直接运行的源码,改完重启 DSH 即生效。

lib/
├── index.js           Host 半侧:HTTP 路由、生命周期、定时清理
├── trash-service.js   核心逻辑:编码、移动、恢复、清理
└── client.js          浏览器半侧:菜单项、横幅、回收站页面

测试

文件 数量 覆盖
test/service.test.mjs 35 路径编码、增删改查、路径穿越防护、格式版本探测
test/host-e2e.test.mjs 15 真实 HTTP 往返,路由按 DSH 源码规则严格校验
node test/service.test.mjs
node test/host-e2e.test.mjs

设计取舍

  • 不引入构建:插件接口就是 { name, inject, apply },手写 ESM 足够,省掉一整条工具链
  • 不碰附件:内容寻址存储没有引用计数,删除会连带破坏其他会话
  • 复用官方组件:菜单行、对话框、图标都用 ui-primitives,和内置 UI 保持同一套视觉语言
  • 降级可用:拿不到 primitives 时有自绘回退,功能不丢

⚠️ 已知限制

  • 路径编码有损:DSH 的 projectKey 会把 D:\a-b\c 和 D:\a\b\c 编码成同一个 key,这是 DSH 的既有行为,插件通过记录原始 key 规避恢复错位
  • 会话格式版本:会探测实际版本号,但全新存储结构仍需适配
  • 仅桌面端验证:Web 端理论可用,但未充分测试

🤝 贡献

欢迎 Issue 和 PR!

  • 发现 Bug → 提 Issue,附上 DSH 版本和复现步骤
  • 想加功能 → 先开 Issue 讨论,避免白做
  • 提交代码 → 确保 npm test 全绿

📄 许可

MIT © dsh-session-trash contributors


如果这个插件帮到了你,给个 ⭐ 就是最好的支持

常见问题

6 问
答案由本站依据条目字段整理,不引用上游原文
dsh-session-trash 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add @lazyra/dsh-session-trash` 即可。

dsh-session-trash 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-session-trash 安全吗?

低风险。

dsh-session-trash 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-session-trash 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

同名或近似条目

5 条
不同作者的仓库分开列,请确认你要装的是哪一个
工具与能力
按星标排序,可作替代方案

loopx

loopx

LoopX 是面向长周期 Agent 的本地优先控制平面,作为 DSH plugin 为 DeepSeek Harness 提供持久目标、证

未标注验证等级 6,233 星

dsh-startup-screen

dsh-startup-screen

DeepSeek Harness 的启动界面与启动动画插件。

未标注验证等级 633 星

dsh-blender-plugin

dsh-blender-plugin

让 AI 模型通过直连 TCP 通道实时驱动 Blender 的 DSH plugin:15 个工具覆盖视口取帧、任意角度渲染、内循环搜索、

未标注验证等级 211 星

tokenledger

TokenLedger

TokenLedger 为 DeepSeek Harness 提供零配置的 Token 用量记账,自动归属到实际服务请求的中转站,无需凭据即

L5 · 运行验证通过 204 星

deepseek-harness-jev

deepseek-harness-jev

把 TypeSafe Jev 接入 DeepSeek Harness 作为 System One 决策层,为技能与文件选择、任务监督、纠偏和

未标注验证等级 203 星

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 —。