把会话移入回收站,可随时还原或永久清除
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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 15 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
xxiiiixx/dsh-session-trash
把会话移入回收站,可随时还原或永久清除
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目