dsh-session-manager:为 DSH 补齐会话列表、跨工作区移动与标签能力

前言

在 DeepSeek Harness(DSH)里长期跑 Agent 时,会话会按工作区持久化到磁盘,侧边栏和注册表负责展示与归档。官方 GUI 能归档,但不能取消归档;没有标签;跨工作区移动会话往往还要重启进程才能对齐路径。若你希望模型直接整理会话,或让浏览器侧插件通过 HTTP 调用同一套逻辑,就需要把「列举、移动、删除、打标签、归档/解归档」收拢到可编程入口上。下面介绍社区插件 dsh-session-manager(维护者 minhaoli),它用 Agent 工具与 loopback REST API 两条轨道共享同一实现,补全上述能力。

这是什么

dsh-session-manager 是 DSH 生态中的工作流类插件(SkillHub 目录页)。一句话定位:为 DSH 提供会话 housekeeping 的 Agent 工具,以及在 webServer 可用时的本机 REST API——列举会话、跨工作区移动、带可选备份的删除、标签读写、归档与解归档。源码与说明见 GitHub:minhaoli/dsh-session-manager(MIT,当前包版本 0.1.0)。SkillHub 为独立社区目录,与 DeepSeek / 幻方无官方从属关系;安装前请自行审阅源码与许可证。插件在当前 DSH 进程权限下读写会话目录与注册表,务必确认你信任该仓库。

与官方界面的关系:README 写明 GUI 只覆盖部分能力;本插件把完整操作面放到模型可调用的六个工具,以及供例如 dsh-session-tree 消费的 HTTP 接口上。

环境与依赖

开发测试针对的 DSH 版本为 0.2.1-rc.2;更早版本未测试。依赖 @deepseek-ai/cordis ~4.0.5,运行时为 Node.js 22+(随 DSH 桌面运行时提供)。插件会读取 workspaceRegistry、sessionPersistence、storageDomain、webServer 等宿主服务;若某版 DSH 重命名或移除其中一项,对应功能会软失败(记 warning)而非拖垮宿主。

核心功能

Agent 工具(六个)

参数均为 JSON,返回 { ok: true, ... } 或 { ok: false, error }。

工具 作用
session_list 枚举持久化会话,含工作区、归档状态、标签、标题;可按 workspaceId、path、archived、tag 过滤
session_move 跨工作区移动:重写日志头 cwd、重命名磁盘目录、热更新注册表,GUI 无需重启即可反映
session_delete 永久删除会话及日志目录;可传 backupDir 先复制目录
session_tag 标签 set / add / remove / clear / drop / list,存于 ~/.dsh/session-tags.json
session_archive 从各分组界面隐藏会话,保留日志与工作区槽位,幂等
session_unarchive 将归档会话恢复到原位置(GUI 未提供的方向)

限制:当前正在运行的 live 会话会被 session_move 与 session_delete 拒绝。

Loopback REST API

仅在存在 webServer 服务时注册(web / desktop 模式)。每个 HTTP 处理最终走对应工具的 execute,与 Agent 面行为一致。

安全边界:请求须经 isLoopbackRequest(req) 校验,非本机对端返回 403 {"error":"forbidden: loopback-only"},无 token,靠传输层限制而非凭证。不要将 DSH Web 服务暴露到 localhost 之外;本插件挂载时尤其如此。

方法 路径 说明
GET /api/dsh-session-manager/sessions 列举会话
GET /api/dsh-session-manager/tags 标签相关查询
PUT /api/dsh-session-manager/tags body: { "sessionId": "...", "tags": ["a","b"] }
DELETE /api/dsh-session-manager/tags body: { "tags": ["a"] },从所有会话移除这些标签
POST /api/dsh-session-manager/sessions/move sessionIds + targetWorkspaceId,或 targetPath 与可选 createIfMissing
POST /api/dsh-session-manager/sessions/delete sessionIds,可选 backupDir
POST /api/dsh-session-manager/sessions/archive sessionId
POST /api/dsh-session-manager/sessions/unarchive sessionId
POST /api/dsh-session-manager/projcache/warm 诊断:标题预热报告

业务成功返回 200;工具 ok: false 或畸形 body 为 400;非 loopback 为 403;方法错误 405;未捕获异常 500。请求体上限 1 MB,须为 JSON 对象。

实现上值得知道的点

  • 移动同步三件事:物理移动(zstd 头改写 + 目录重命名)、注册表重索引与 attachSession / detachSession、以及经 storage-domain 表更新 projection cache 的 identity.cwd。任一步遗漏会导致 GUI 路径陈旧。
  • 标题预热:冷启动后未打开过的会话在 session.list 中可能没有标题;挂载约 800 ms 后插件会对缺标题行的持久化会话调用官方 coldSnapshot 写回 checkpoint。lib/index.js 中 WARM_TAIL_PROBE 默认为 false,避免重启时对大量会话读日志尾部拖慢侧边栏;若需启动时校验已有标题行,可改为 true。
  • 归档走注册表公开 API archiveSession(),与 GUI 同源;除显式删除或解归档外不重写归档集合。
  • 零第三方 import:lib/index.js 仅用 node: 内置模块,便于作为独立 file plugin 加载。

安装与启用

先做 profile 选择:实际启动用的 profile——桌面 Electron 为 desktop,CLI 可为 web / headless / node。desktop profile 在应用运行时会拒绝 dsh CLI 写入;应在应用内插件管理器安装,或先关闭应用再用 CLI。

推荐从 Git 安装:

# from git (recommended)
dsh plugin --profile <your-profile> add github:minhaoli/dsh-session-manager

# or from a local checkout
dsh plugin --profile <your-profile> add /absolute/path/to/dsh-session-manager

包声明了 dsh.bundle.patch,dsh plugin add 会把它追加到 dsh.profile.bundles,下次启动由 loader 挂载。若手工安装,需在 ~/.dsh/profiles/<profile>/cordis.patch.yml 自行插入:

- insert:
    - id: session-manager
      name: 'dsh-session-manager'

典型用法

通过 curl 操作标签(本机 Web 端口以你环境为准,示例为 3080)

先确认 DSH 已在 loopback 上提供 webServer,再调用:

curl -s http://127.0.0.1:3080/api/dsh-session-manager/tags
curl -s -X PUT http://127.0.0.1:3080/api/dsh-session-manager/tags \
  -H 'content-type: application/json' \
  -d '{"sessionId":"abc123","tags":["research","todo"]}'

列举会话、移动、删除、归档等对应上表 POST/GET 路径,body 字段与 Agent 工具参数一致。

在对话里让模型整理会话

在已挂载本插件的 DSH 配置下,模型可调用 session_list 按工作区或标签筛选,再用 session_move、session_tag、session_archive / session_unarchive 等完成整理;删除前可用 session_delete 的 backupDir 留副本。

与侧边栏 UI 配合

dsh-session-tree 通过本插件 REST API 渲染标签、拖拽移动与归档菜单。README 注明它会替换官方 ui-workspace bundle,两者同时安装时应禁用官方那一行。同作者还有 dsh-session-query-vector、dsh-session-search、dsh-ui-reload 等配套插件,可按需组合。

适用场景与注意

适合:需要批量或程序化会话治理的 DSH 用户——跨工作区搬迁历史对话、给会话打标签便于检索、解归档 GUI 撤不回的会话、在删除前备份日志目录;以及开发消费 loopback API 的浏览器插件。

注意:

  1. 插件权限即 DSH 进程权限,能读写的路径与会话数据范围与宿主相同。
  2. REST 仅 loopback,勿将 Web 服务暴露到公网。
  3. 依赖 DSH 0.2.1-rc.2 及上述 Cordis 服务面;升级 DSH 后若能力异常,先查日志中的 warning。
  4. 社区目录与 GitHub 星标等元数据以站点为准(目录页当前星标为 0),不代表官方背书。

结尾

dsh-session-manager 把 DSH 会话管理的完整操作面统一到 Agent 工具与本机 REST API,弥补 GUI 在解归档、标签与热移动上的缺口,并作为 session-tree 等 UI 插件的后端。进一步了解与安装:

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

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

小夜