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

会话整理 Tazewell/dsh-session-tidy

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

删除会话进回收站,改写已发请求并分叉重发

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

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

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

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/10/27·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 13 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 21 处,展示前 19 条)
  • 发起网络请求
    client.js:138
    const response = await fetch(`${ENDPOINT}${action}`, {
  • 读取本地文件
    lib/trash.js:21
    await stat(path)
  • 读取本地文件
    lib/trash.js:31
    for (const entry of await readdir(dir, { withFileTypes: true })) {
  • 读取本地文件
    lib/trash.js:34
    else if (entry.isFile()) total += (await stat(path)).size
  • 写入本地文件
    lib/trash.js:44
    await rename(source, target)
  • 删除本地文件递归
    lib/trash.js:50
    await rm(source, { recursive: true, force: true })
  • 读取本地文件
    lib/trash.js:81
    const keys = await readdir(sessionsRoot).catch(() => [])
  • 写入本地文件
    lib/trash.js:92
    await mkdir(entriesRoot, { recursive: true })
  • 读取本地文件
    lib/trash.js:93
    const names = await readdir(entriesRoot)
  • 读取本地文件
    lib/trash.js:98
    if (!(await stat(dir)).isDirectory()) continue
  • 写入本地文件
    lib/trash.js:138
    await mkdir(entryDir, { recursive: true })
  • 删除本地文件递归
    lib/trash.js:142
    await rm(entryDir, { recursive: true, force: true })
  • 写入本地文件
    lib/trash.js:145
    await writeFile(join(entryDir, 'meta.json'), `${JSON.stringify(record, null, 2)}\n`, 'utf8')
  • 删除本地文件
    lib/trash.js:146
    await rm(join(cacheRoot, `${id}.json`), { force: true })
  • 写入本地文件
    lib/trash.js:162
    await mkdir(parent, { recursive: true })
  • 删除本地文件递归
    lib/trash.js:164
    await rm(entryDir, { recursive: true, force: true })
  • 删除本地文件递归
    lib/trash.js:173
    await rm(join(entriesRoot, entry.dirName), { recursive: true, force: true })
  • 删除本地文件递归
    lib/trash.js:180
    await rm(entriesRoot, { recursive: true, force: true })
  • 写入本地文件
    lib/trash.js:181
    await mkdir(entriesRoot, { recursive: true })
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

把 DeepSeek Harness 会话删除后放进可恢复的 7 天回收站,还能通过分支编辑已发出的请求。一个 DSH 插件。

README

由 DeepSeek 最新模型翻译生成
dsh-session-tidy DSH 的会话整理插件:删除(进可恢复的回收站)和改写已经发出去的请求(分叉重发)。 Delete DSH sessions into a recoverable trash, and edit an already-sent request by branching. DSH 目前只能归档会话:归档只是把 id 记进 archivedSessionIds,日志目录原封不动。 这个插件补上了真正的删除,以及「发错了想改」这件事:会话从列表消失、文件移到回收站, 7 天内可以原样恢复;任意一条用户消息都能改,改完从一个新分支继续。 使用 侧边栏里每个会话的悬浮操作区和「…」菜单各有一个删除入口: 1. 点击删除 → 确认对话框显示会话标题。 2. 确认后 Host 先停止该会话正在跑的任务(子代理、后台命令、定时提醒),再把它移入回收站,并清掉投影缓存。 3. 侧边栏底部的垃圾桶按钮打开回收站,可以: - 恢复:文件回到原来的会话目录、重新挂回原工作区、解除归档; - 彻底删除:立即删掉回收站里的目录,不可恢复; - 清空回收站:删除全部记录(会二次确认)。 当前正在主视图打开的会话不能删除:对话框会提示先切换到其他会话。
展开完整文档(README 剩余 1 节)
dsh-session-tidy

DSH 的会话整理插件:删除(进可恢复的回收站)和改写已经发出去的请求(分叉重发)。

Delete DSH sessions into a recoverable trash, and edit an already-sent request by branching.

DSH 目前只能归档会话:归档只是把 id 记进 archivedSessionIds,日志目录原封不动。
这个插件补上了真正的删除,以及「发错了想改」这件事:会话从列表消失、文件移到回收站, 7 天内可以原样恢复;任意一条用户消息都能改,改完从一个新分支继续。

使用

侧边栏里每个会话的悬浮操作区和「…」菜单各有一个删除入口:

1. 点击删除 → 确认对话框显示会话标题。
2. 确认后 Host 先停止该会话正在跑的任务(子代理、后台命令、定时提醒),再把它移入回收站,并清掉投影缓存。
3. 侧边栏底部的垃圾桶按钮打开回收站,可以:
- 恢复:文件回到原来的会话目录、重新挂回原工作区、解除归档;
- 彻底删除:立即删掉回收站里的目录,不可恢复;
- 清空回收站:删除全部记录(会二次确认)。

当前正在主视图打开的会话不能删除:对话框会提示先切换到其他会话。

修改任意一条请求(发送后 / 停止后)

每条用户消息下面(时间、复制按钮那一行)都多了一个铅笔图标:鼠标移到那条消息上才会显现,点它就改这条请求——不必是最后一条。

1. 点击某条消息的铅笔 → 对话框「修改这条请求」里就显示这条请求的原文,可以直接改。
2. 确认后插件在该请求之前 fork 出一个分支会话,把改好的内容写进新会话的输入框草稿,并自动切过去。分支的历史正好停在「这条请求之前」,所以这条提问和它后面(以及它自己的半截回答)都不会带过去。
3. 在分支里看过没问题就回车发送。

切点取的是上一条已完成 turn 的结尾(turn/end 的 seq),不是「消息 seq − 1」:用户消息前面还有它自己那条 turn 的 turn/start、step/start,按 seq − 1 切会让宿主给这个空 turn 补一个「forked」结束,界面上就会多出一行没有内容的「已完成,用时 1 秒」。
规则还会跳过这种空 turn(两条 turn-tail 相邻),所以之前编辑留下的空壳会在下一次编辑时一起丢掉。

对话框里有一个默认勾选的选项「把原会话移入回收站(7 天内可恢复)」:

- 勾选(默认):分支沿用原会话的标题,原会话进回收站,侧边栏里看起来就是「同一个会话被改掉了」;想找回来随时去回收站恢复。
- 取消勾选:原会话保留,分支标题加 (1) 后缀,两个会话并存,可以对照。

如果原会话移入回收站失败(比如文件一时被占用),分支照常保留并提示原因,不会因为回收失败把已建好的分支丢掉。

为什么要 fork:DSH 目前没有「原地截断会话日志」的能力(只能归档、不能回退), fork 是唯一能「替换掉这条请求」又不丢历史的方式。

实现说明:用户气泡的操作行(时间和复制按钮)由官方组件写死、没有开放 Slot,插件是在渲染完成后把铅笔注入到 [data-chat-flow-kind="user"] 气泡里的 [data-clock="start"] 操作行,节点 key 取自 data-chat-node-key,再用它回到 chat 投影里取 seq 和原文;样式只用 --dsw-alias- 变量,会话卸载时会把注入的节点和样式一并清掉。

限制与说明:

- 只能取回文本:附件、@ 引用的 chip 不会跟着过去(正文会保留)。
- 会话正在跑的时候铅笔置灰(先停止,再编辑);没有可编辑文本(比如只发了图片)的消息不显示。
- 改的是较早的消息时,那条消息之后的对话只存在于原会话里——所以默认把原会话放进回收站,取消勾选就能两边都留着。
- 草稿是写给分支会话的,取消编辑不会污染当前会话的草稿。
- 分支和原会话共享同一条前缀历史,所以上下文是连续的。

存储与保留

~/.dsh/session-trash/entries/<时间戳>-<会话 id>/ meta.json # id、标题、原工作区、删除时间、字节数 session/ # 原来的会话目录

- 回收站保留 7 天,过期条目在下次打开回收站时惰性清理。
- 删除只发生在 ~/.dsh 内,路径会做目录逃逸校验;接口只接受本机回环调用、同源请求并带 x-dsh-plugin: session-tidy 头,杜绝任意网页或局域网客户端调用。
- 想立即清空磁盘占用,用回收站里的「彻底删除 / 清空回收站」。

安装

包名 dsh-session-tidy(npm),bundle 名同名。

插件管理器(推荐):用 plugin_manager 的 install_bundle 指向包目录(或解压后的目录),或在插件市场里按包名安装。管理器会负责 profile 的 package.json、cordis.patch.yml 与依赖。

手动登记:在 ~/.dsh/profiles/<profile>/package.json 里加

"dependencies": { "dsh-session-tidy": "^1.0.0" },
"dsh": { "profile": { "bundles": ["@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-session-tidy"] } }

再在 profile 目录安装依赖并重启 DSH。Host 半随插件树加载,Client 半在刷新页面后出现。

本地开发:把仓库目录用目录联接挂到 profile 的 node_modules/dsh-session-tidy,依赖写 "dsh-session-tidy": "link:<绝对路径>";bundle patch 会让 HMR 直接重排插件树。

卸载

1. 从 profile package.json 的 bundles 与依赖里删掉 dsh-session-tidy。
2. 删除 node_modules/dsh-session-tidy。
3. 需要的话删除 ~/.dsh/session-trash。

结构

- index.js — Host 入口:解析 DSH home、注册 /plugin/session-tidy 前缀路由,删除前调用 workspaceRegistry.archiveSession(id, { stopActivity: true }),恢复后重新 attachSession 并 unarchiveSession。
- lib/trash.js — 回收站存储:移动(跨盘回退到复制+删除)、meta、恢复、清理、过期。
- lib/routes.js — HTTP 层:GET trash、POST delete|restore|purge|empty,含同源与请求头校验。
- client.js — 浏览器侧:会话行删除按钮、菜单项、侧边栏底部回收站入口、每条用户消息的悬停铅笔(注入到官方气泡操作行)、确认框 / 回收站对话框 / Toast (全部使用 --dsw-alias- 主题变量,跟随明暗主题)。
- cordis.patch.yml — bundle patch,插入 session-tidy 这一行。

测试

node --test "test/*.test.mjs"

38 个用例覆盖回收站存储、HTTP 路由(回环/同源校验、回滚、错误码)、Host 注册, Client 的插槽注册与词典完整性,以及消息铅笔的注入 / 禁用 / 取值、弹窗内直接编辑、空内容禁用确认、fork 切点(上一条 turn/end、跳过空 turn)、草稿写入(写入的是改后文本)、原会话入回收站与失败提示。

实际联调记录(隔离的 DSH_HOME + 独立端口,未触碰真实会话):

- POST delete → 归档并移入回收站、session_projcache 同步清除;
- GET trash → 列出条目(含标题、大小、时间);
- POST restore → 文件回到原目录、条目清空;
- POST purge / empty → 目录删除;
- 无标记头 / 跨源 → 403,路径逃逸 id → 400;
- 对「注册表已知」和「注册表未知」两类会话都验证过删除与恢复。

已安装到 desktop profile 并现场确认 /plugin/session-tidy/trash 返回
{"ok":true,"entries":[]},说明 Host 半已生效;浏览器内的最终视觉呈现
需要在实际页面里确认。

暂未做(后续备选)

- 空会话 / 空分支批量清理
- 分支血缘标记与「回到原会话」
- 编辑时带上附件与 @ 引用
- 批量清理面板(按工作区筛选、按大小排序、批量删除)
- 导出会话、存储占用统计
预览分享卡片长什么样 ↓Tazewell/dsh-session-tidy
分享 · DeepSeek Harness Hub
Tazewell/dsh-session-tidy

删除会话进回收站,改写已发请求并分叉重发

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部