dsh-session-admin:把 DSH 已归档会话从磁盘真正删掉

前言

DeepSeek Harness(DSH)侧栏里可以归档会话,核心侧提供的是 archiveSession——给会话打归档标记。WorkspaceRegistry 没有 delete-session,SessionPersistence 也只有 create、open、flush、stat、list 等能力,界面上因此删不掉已归档会话占用的日志和缓存,长期积累会占满 ~/.dsh/sessions 等目录。社区插件 dsh-session-admin(维护者 hehf21,分类:客户端)在宿主注册两条路由,并在侧栏底部提供入口,把「删日志、清投影缓存、摘归档标记」固化成可调用接口,避免每次手写脚本。

这是什么

dsh-session-admin 面向本机 DSH 桌面用户:列出已归档会话,经二次确认后从磁盘删除对应数据,并更新 workspace.json 里的归档与工作区引用。插件版本 0.1.0,MIT 许可,要求 Node.js >= 20。目录页见 SkillHub,源码与说明见 GitHub。

核心功能

侧栏与会话清理面板

客户端通过 Cordis patch 注入 @deepseek-ai/dsh-client-ui-sidebar,在侧栏底部(设置上方)增加「会话清理」入口。打开后面板会:

  1. 列出全部已归档会话:id、占用大小、最后活动时间、是否有数据、是否正在运行;
  2. 支持勾选后「删除选中」,或「全部删除」;
  3. 删除前二次确认;执行完显示释放空间、剩余归档数量,并提示刷新页面以同步侧栏。

宿主路由

宿主侧注册两条同源路由(仅 POST 删除、单次最多 500 个 id,id 须匹配 ^[A-Za-z0-9_-]{1,128}$):

GET  /session-admin/state
  → { ok, home, counts:{archived,onDisk,bytes}, items:[{id,bucket,onDisk,bytes,mtimeMs,live}] }

POST /session-admin/delete   body: { ids: string[] }
  → { ok, deleted:[], skipped:[{id,reason}], freedBytes, freedMB, remainingArchived, backup, needRestart }

skipped 中 reason 可为:not-archived(未归档)、live(运行中)、no-data(只剩标记、数据已不存在,仍会清标记)。

两条硬闸门

下面两条限制在路由层强制执行,避免误删:

  1. 只删已归档会话:id 不在 global.archivedSessionIds 内一律拒绝(not-archived)。要删常用会话,需先在侧栏归档。
  2. 活着的拒删:ctx.agents.get(id) 能取到的会话(含当前对话)一律拒绝(live)。

删除时改动的文件

经 POST 删除且通过闸门后,插件会:

  1. 移除 ~/.dsh/sessions/<bucket>/<id>/ 整目录(含 session.v4.jsonl.zstd 等);
  2. 移除 ~/.dsh/storages/session_projcache/sessions/<id>.json 投影缓存;
  3. 更新 ~/.dsh/storages/workspace.json:从 global.archivedSessionIds 与各 workspaces[*].sessionIds 去掉该 id;写前备份为 .bak-session-admin-<时间戳>。

已知行为:宿主进程仍可能按内存中的旧集合渲染;若其它操作回写 workspace.json,归档标记可能被写回,但会话数据已不在。重启后启动期会剪掉指向不存在会话的标记。面板提示的「刷新页面」用于让侧栏立刻同步。

安装与启用

README 给出的本机安装示例(路径需换成你本机插件目录):

dsh plugin --profile desktop add 'link:D:/大龙虾/dsh-plugins/dsh-session-admin'

dsh plugin 会把包写入 profile 的 package.json 的 dependencies 与 dsh.profile.bundles,并在 node_modules 建立 junction。装完后重启一次 DSH 桌面(宿主侧为进程内插件,不重启不生效);浏览器侧刷新页面即可看到侧栏入口。

回滚:

dsh plugin --profile desktop remove dsh-session-admin

必要时用 profile 下的 package.json.bak-session-admin-20261026、pnpm-lock.yaml.bak-session-admin-20261026 覆盖回去。

典型用法

  1. 在 DSH 侧栏把不再需要的会话归档。
  2. 打开侧栏底部「会话清理」,查看列表中的大小与 live 状态。
  3. 勾选目标会话,点「删除选中」或「全部删除」,在确认框中确认。
  4. 根据面板提示刷新页面,使侧栏与会话列表与磁盘状态一致。

开发者可在仓库 tests/ 下用 Node 自测(不依赖真实 DSH 进程):

node tests/session-admin-test.mjs         # 删除核心逻辑(临时 DSH_HOME)
node tests/session-admin-route-test.mjs   # 桩 Context 打两条路由
node tests/session-admin-client-test.mjs  # 最小 hook 运行时渲面板并点删除

适用场景与注意

适合长期在本机 DSH 桌面跑多工作区、归档会话较多、需要回收磁盘空间的开发者。不适合当作「一键清空所有会话」工具:未归档与正在运行的会话会被跳过。

插件以当前 DSH 进程权限读写 ~/.dsh;安装前建议阅读 源码与 LICENSE,确认行为符合预期。SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系;星标与版本以仓库与目录页为准。

结尾

dsh-session-admin 补的是 DSH 核心「能归档、不能删盘」的空档:侧栏入口加 /session-admin/state 与 /session-admin/delete,在归档与 live 两道闸门下清理日志、投影缓存和 workspace 标记。需要时可从 SkillHub 目录页 进入说明,或直接在 GitHub 查看 README 与 issue。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye