DSH Plugins Marketplace

DSH Plugins

Plugins

/

Development & Infrastructure

/

dsh-archive-trash

h

dsh-archive-trash

Manifest valid★ 2

DSH Archived Session Cleanup: Move archived sessions into a restorable Recycle Bin, or delete them permanently.

UI (client)hasBundlePatch

dsh-archive-trash 🗑️

DSH 没做「删除会话」。这个插件补上 —— 而且删错了能捡回来 👋

你的 sessions/ 里住着一窝僵尸 🧟

DeepSeek Harness 的「归档」很温柔:从侧边栏消失,文件原地不动。温柔到有点问题——那些你再也不会打开的会话,日志会永久躺在 $DSH_HOME/sessions/ 里,一天天攒,几十个、上百个目录,每个都还在偷偷占地方。

官方的按钮叫「归档」,不叫「删除」。因为删除这件事,它没做 😅

这个插件来补上:任意会话都能删,删错了还能捡回来 🪄

能干什么 🎁

  • 任意会话,行上直接删 — 鼠标划到会话行尾就冒出一个小垃圾桶 🗑️,点一下变 ✓/✕ 二选一。不用先归档 🎯
  • 立刻生效 — 删完会话马上从侧边栏消失,还原马上回来。不用重启 DSH ⚡
  • 正在跑的会话不给删 — 包括你此刻正打开的这个。按钮会变灰,鼠标悬停说明原因 🛡️
  • 批量清空 — 设置页里「全部移入回收站」一键搞定,不用一个个勾
  • 移入回收站 — 整个会话目录搬进 $DSH_HOME/.trash/sessions/,原位置立刻腾空 🧹
  • 后悔药管够 — 回收站里勾一下就能放回原位。目标位置被占了?它会明确拒绝,而不是悄悄覆盖 💊
  • 彻底删除 — 单选删,或者一键清空整个回收站。都要二次确认,防手滑 ✋
  • 自动清理幽灵条目 — 归档集合里指向已删文件的失效 id 会被自动摘掉,不会再显示成「日志已不在磁盘上」的僵尸行 👻➡️🚫
  • 中英双语 — 跟着 DSH 的界面语言走 🌏
  • 跟皮肤不打架 — 只用 --dsw-alias-* 主题 token,亮色暗色都服帖 🎨

它不干什么 🙅

  • 不碰你的工作目录 — 只动会话日志目录,项目文件一根头发都不动
  • 不重写持久化后端的目录编码规则 — 会话位置是按 sessionId 反查出来的,后端哪天改了编码,它也不会跟着坏
  • 不删正在跑的会话 — 运行中的会直接拒绝
  • 不在归档时自动删除 — 归档还是归档。删除永远是你主动点的那一下 👆

安装 📦

dsh plugin --profile web add dsh-archive-trash

桌面端把 web 换成 desktop。

或者下 Release 里的预构建 tarball,本地装,免构建授权:

dsh plugin --profile web add ./dsh-archive-trash-0.3.2.tgz

也可以直接在 DSH 里点 设置 → 插件 → + 添加插件,把 dsh-archive-trash 粘进去 🖱️

装完重启 dsh web(桌面端重开应用),Host 半边才会上线 ⚡

怎么用 🕹️

最快的路子:侧边栏里把鼠标划到任意会话行上 → 行尾垃圾桶 🗑️ → ✓ 确认。不用先归档。

批量:设置 → 归档清理 → 「全部移入回收站 (N)」一键清空。

精细操作:

  1. 打开 设置 → 归档清理
  2. 「已归档」里能看到所有归档会话——标题、cwd、时间、占了多少空间
  3. 勾选 → 移入回收站 🧹
  4. 反悔了?切到「回收站」→ 勾选 → 还原 💊
  5. 确定不要了?彻底删除 🔥 或 清空回收站 🔥

⚠️ 正在运行的会话不能删 —— 按钮会变灰并提示原因。

磁盘布局 🗂️

$DSH_HOME/
├── sessions/<cwd 编码>/<sessionId>/session.v4.jsonl.zstd   ← 会话日志
└── .trash/sessions/<时间戳>-<sessionId>/
    ├── payload/                    ← 原会话目录整体搬过来
    └── meta.json                   ← { sessionId, originalPath, title, cwd, deletedAt }

meta.json 里的 originalPath 是还原的唯一依据——所以回收站条目别手工改名,改了它就不认得回家的路了 🏠

本地 API 🔌

Host 半边注册了 POST /dsh-archive-trash,body 是 { action, ... }:

action参数作用
list—返回 { items, trash, missingRegistry, prunedOrphans }
deletesessionIds: string[] 或 all: true移入回收站;sessionIds 不限归档状态,all: true = 当前全部归档会话
restoreentryIds: string[]从回收站还原
purgeentryIds: string[](空数组 = 清空全部)彻底删除
prune—只做一致性维护:清掉归档集合里指向已删文件的幽灵 id

所有请求都过一道信任栅栏 🛡️:跨站标记(Sec-Fetch-Site: cross-site)一律拒,Origin 与 Host 不同源一律拒,非回环地址交给宿主的 connection.requestRejection 判。

自检 🧪

仓库里带一个不碰真实 $DSH_HOME 的自检脚本——临时目录搭一套假会话布局,加载 Host 半边,用假 req/res 打真实 handler:

node selftest.mjs

16 组场景全绿 ✅:列表 / 跨站拒绝 / 空选择 / 移入回收站 / 回收站列表 / 还原 / 目标占用拒绝 / 彻底删除 / 清空回收站 / 不存在的会话 / 未知 action / 幽灵条目自动清理 / 批量清空 / 同毫秒批量不撞 entryId / prune 一致性维护 / 非归档会话也能删

踩过的坑 🕳️

这些都是这个插件自己修掉的真 bug,记下来省得以后又踩:

① 删完会话冒出个「未分组」工作区

DSH 前端 groupByWorkspace 的算法是:按各 Workspace 的 sessionIds 记账,凡是「在会话列表里、但没被任何 Workspace 记账」的会话都会掉进 stray,渲染成一个额外的「未分组」分组。

插件的 detachSession() 恰好就是把 id 从记账里摘掉 —— 但此刻前端内存里的会话列表还没刷新,那条会话仍在,于是立刻变成 stray。重启后从磁盘重载,文件已经没了,stray 才消失(所以表现为「重启才好了」)。

修法:不 detach,保留记账,只摘归档集合;紧接着调 ctx.sessions.refresh() 让 Client 重拉基线。文件没了 → 列表里没了 → 记账里的残留 id 被跳过,stray 为空,不再出现「未分组」。

② 归档列表里挂着「日志已不在磁盘上」的僵尸行

archivedSessionIds 是持久化的,文件被删(或手工删掉)之后,那个 id 会永远留着。原来的实现老老实实把它列出来,标一句「日志已不在磁盘上」——看着像坏掉了。

修法:list 时顺手对账,磁盘上找不到的 id 直接从归档集合摘掉,不再渲染;返回值里带 prunedOrphans 计数。另外提供 prune action 做纯维护。

③ 删除按钮只对归档会话显示(v0.3.0 修正)

v0.2.0 把入口限制成「只有已归档的会话才显示删除按钮」——结果想删普通会话得先归档再删,多两步,还容易被当成插件坏了。

修法:删除按钮对所有会话开放。配套把 moveToTrash 的元数据来源从「只查归档集合」改成 describeSessions()(归档集合 → sessionQuery 回退),否则普通会话删进回收站后标题是空的。

④ 删了/还原了界面纹丝不动,必须重启(v0.3.2 修正)

这是最重要的一条。前端列表不是每次都从磁盘读的,它靠两条远端事件增量维护:

Host  ctx.emit('api-session/removed', id)     → 前端 handleSessionRemoved → 列表删掉这行
Host  ctx.emit('api-session/added', summary)  → 前端 handleSessionAdded  → 列表加回这行

宿主自己只在 session/created / session/disposed 时发这两个事件。插件只是搬文件、没有真的 dispose 会话,所以一个都没发 —— 界面当然不动,只有重启时列表从磁盘重建才"修好"。

修法:删除后补发 removed,还原后补发 added(载荷按 ApiSessionList.summaryFor 的结构构造:sessionId / updatedAt / agentAvailable / formatStatus / running / blank,冷会话就 running: false, agentAvailable: false)。

这个坑还有一个变体:v0.3.1 只补了删除方向的 removed,忘了还原方向的 added —— 于是「还原还是不行」。两个方向必须成对处理。

兼容性 📋

  • 需要 DSH 0.2.x(settings.section slot + workspaceRegistry 服务)
  • web 与 desktop 两种 profile 都适用

License

MIT

Comments

Loading…

From the same category

awesome-dsh-plugin

by awesome-dsh-plugin

A curated list of plugins for DeepSeek Harness (dsh) · DeepSeek Harness 插件精选列表

Development & Infrastructure

★ 20.5k

CC0-1.0

Python

Oct 25, 2026

Index only — not installable

by 0xsline

DeepSeek Harness (DSH) ecosystem: curated plugins, tools, and infrastructure from dsh-external/hub and the public dsh-plugin topic.

Development & Infrastructure

★ 1.3k

CC0-1.0

Python

Oct 16, 2026

Index only — not installable

by pax-beehive

Open-source CLI, schemas, resolver, and DSH agent tools for DSH Plugin Hub

Development & Infrastructure

★ 277

MIT

TypeScript

Oct 20, 2026

Index only — not installable

by xiajiajun516

DeepSeek Harness (DSH) backup & restore plugin — export, import, migrate and sync your complete DSH configuration, plugins, MCP servers, skills and workspace. One-click migration to another machine.

Development & InfrastructureManifest valid

★ 240

MIT

TypeScript

Oct 24, 2026

dsh plugin --profile web add dsh-config-manager

by yjh051108

推荐组件(非必须):DeepSeek Harness 运行时注入器;已随 dsh-routing-suite 单仓库化保留,本仓库继续维护/发布。

Development & InfrastructureManifest valid

★ 167

TypeScript

Oct 16, 2026

dsh plugin --profile web add @dsh-external/dsh-super-injector

by Yuuyuko-uu

DSH 鱼的记忆:给会话一份会淡忘的长期记忆,每条都带时间

Development & InfrastructureMemory & ContextSessions & MessagesManifest valid

★ 135

MIT

JavaScript

Oct 24, 2026

dsh plugin --profile web add dsh-fish-memory