dsh-session-mng
One Settings page for every DeepSeek Harness session — generate a title from the whole conversation, archive or restore, move a cold session to another workspace, and permanently delete archived sessions.
一个设置页管理全部 DSH 会话:按整段对话生成标题、归档/恢复、跨工作区移动、彻底删除已归档会话。Host + Web Client 双半插件,无运行时依赖,不注册模型可见工具,不注册标题 provider。
Quick start (EN) — Desktop app: install from the in-app Plugins page (the
desktopprofile is app-managed, sodsh plugin --profile desktop …refuses). CLI-managed profiles:dsh plugin --profile <profile> add dsh-session-mng. Open Settings → Session Manager. Nothing is written until you press a confirm button in a dialog.

功能
- 统一会话总览:按工作区分组列出当前 profile 的全部会话(活跃 + 已归档)。显示标题、路径、会话 id、大小、最后活动时间、运行/已打开/已归档/已置顶/子会话标记;支持搜索、工作区筛选、排序、刷新、批量选择。
- 工作区优先 + 分页:会话数 >100 时默认折叠工作区;每个工作区默认 50 条,「加载更多」继续展开;搜索自动展开命中工作区。过滤工具栏和批量条整体吸顶。
- 选择跟随可见集:切换筛选/折叠/搜索/刷新后,隐藏会话自动取消选择;
全选当前列表只作用于当前筛选与已展开的工作区。 - 生成标题:选中任意会话(包括已归档的冷会话),让模型总结整段对话,给出可编辑的标题提案;确认后才写入。活跃会话走官方
sessionTitle.rename,冷会话按官方session/title事件形状追加,不需要恢复会话。 - 归档 / 恢复:调用官方
workspaceRegistry.archiveSession/unarchiveSession。运行中的会话先提示,用户二次确认后才停止并归档;恢复后回到原工作区原位置。 - 跨工作区移动:把冷会话真正迁移到目标工作区——改写会话日志 header 的
cwd、把日志目录迁到目标项目目录、同步 workspace 账本。SessionId、归档状态、pin 状态不变,事件字节不变。 - 彻底删除已归档会话:删除前先预览范围(根会话、子代理会话、目录、字节数);确认后把日志目录移出 store、清理归档集合与 workspace 账本,再删除。不可恢复。
- 预览最近消息:不恢复会话即可看最近 10 条用户/助手消息。
- 失效归档标记清理:归档集合里有、但磁盘上已无日志的 id,会以横幅提示并允许清理。
- 中英双语、浅色/深色主题跟随宿主。



安装
桌面版(DeepSeek Harness.app)
desktop profile 由应用独占,命令行不接管它。请在应用内 设置 → 插件(Plugins) 中搜索 dsh-session-mng 安装;安装后在 设置 → 会话管理 打开。
本地开发 / 未发 npm 时,在应用内插件管理器使用「从本地目录安装」,或在支持 plugin_manager 的会话里把本仓库目录作为 bundle 安装。
命令行管理的 profile(web / main / 自建)
# 从 npm 安装(发版后)
dsh plugin --profile <profile> add dsh-session-mng
# 从 GitHub 源码安装
dsh plugin --profile <profile> add github:ZilongYang/dsh-session-mng#main
# 本地开发:把本仓库直接链接进去
dsh plugin --profile <profile> add link:/绝对路径/dsh-session-mng
Host 半是进程内模块:装完如果看不到页面,重启一次 dsh/应用再刷新页面;Client 半刷新页面即可。
市场状态:awesome-dsh-plugin 收录 PR #9672 的
check已通过;Submission gate目前只差仓库满 1 天(约 2026-10-28 00:44 Asia/Shanghai 自动重跑),无需重新提交。合并后 dshmarket 读取同一份目录,卡片版本随 npm 显示0.1.1。
使用
- 打开 设置 → 会话管理。
- 顶部 tab 切换 全部 / 活跃 / 已归档;用工作区下拉、搜索框、排序缩小范围。
- 点任意会话进入详情:生成标题、打开、归档/恢复并打开、移动到其他工作区、彻底删除(仅已归档)。
- 在列表里勾选多个会话可批量归档、恢复、移动、删除;批量删除也会先显示范围确认。
- 所有写操作都要在界面里明确点击确认;标题提案本身不写任何数据。
它是怎么工作的
Settings page (client.js)
│ GET /session-mng/api/state
│ POST /session-mng/api/{preview,title/propose,title/apply,archive,unarchive,delete/preview,delete,move}
▼
Host route (lib/api.js) ──► service (lib/service.js)
├─ state : sessionController/sessionQuery + workspaceRegistry + sessionPersistence
├─ title : sessionQuery.readSurface → ctx.llm.stream → 确认后写 session/title 事件
├─ archive : workspaceRegistry.archiveSession / unarchiveSession
├─ move : 日志 header cwd 重写 + 目录迁移 + workspace 缓存对账(失败全回滚)
└─ delete : 删除范围预览 → 目录移入临时区 → 清理账本 → 删除(失败回滚)
- 标题是日志事件:
session/title的source为user,与官方重命名一致;已归档会话不需要恢复 Agent。 - 工作区归属是派生的:由会话 header 的
cwd决定。移动必须改写 header,只改账本无效。 - 不碰事件正文:移动只重写日志第一个 frame(header),其余字节原样保留;移动后重新完整 replay 校验一次。
- 事务式删除/移动:目录先移出 sessions root 到同文件系统的临时目录,失败可回滚;成功后才删除临时副本。
- 零模型工具:不注册 agent tool、不注入系统提示词、不注册 title provider,正常对话的 token 开销为 0。
兼容性
| 项 | 说明 |
|---|---|
| 实测宿主 | DSH 0.2.1-rc.2(Desktop desktop profile,Web GUI) |
| Node | >=20.3 可运行总览/标题/归档/删除;移动 需要 node:zlib 的 Zstandard 支持(Node >=22.15,当前 Desktop 运行时为 Node 24.21) |
| 会话后端 | 移动/删除只支持本地 JSONL 后端(sessionPersistence.locate);其他后端仍可用总览/标题/归档/恢复 |
| 官方依赖 | 无 runtime 依赖;只使用 ctx 服务 |
| 已知限制 | 已打开(live)会话不能移动或彻底删除,重启 DSH 后重试;有子代理后代的会话不能单独移动;子会话不出现在主列表(可勾选「显示子会话」查看) |
| 规模限制 | 0.1.1 的折叠/分页只在客户端压 DOM,state 仍一次拉全量(202 条约 103 KB;10000 条约 5 MB)。Host 侧 overview + paged sessions 是 0.2.0 的主任务 |
版本敏感点(请读)
移动需要让 workspace registry 的内存 header 缓存先认识新 cwd,再走公开的 attachSession / detachSession。这个 seam 在当前实测版本可用,但属于宿主内部细节:
- 写盘前做特性检测;接口形状变化时直接拒绝移动并返回
unsupported-registry,不会留下半移动状态。 - 移动/删除都有回滚;极端情况下返回
manual-recovery,并在错误 details 中给出源目录、目标目录和备份目录。 - 兼容性只声明到实测版本;升级 DSH 后请先跑一遍
npm test与本文的实机验收清单。
配置(可选)
在 profile 的 patch 行里可以覆盖默认值;所有值都会 clamp:
- id: session-mng
name: 'dsh-session-mng'
config:
maxBatch: 50 # 归档/恢复/删除单次最多 id 数
maxMoveBatch: 20 # 移动单次最多 id 数
titleTimeoutMs: 30000
titleMaxInputBytes: 32768
titleMaxOutputTokens: 256
titleMaxBytes: 120
allowRemote: false # 默认只接受 loopback / webRuntime.trustedHosts
sessionsRoot: '' # 仅在 sessionPersistence.locate 缺失时作为定位兜底
安全边界
- API 路由默认只接受 loopback 或宿主
webRuntime.trustedHosts;拒绝Sec-Fetch-Site: cross-site与不匹配的Origin。 - 请求体上限 64 KiB;只接受 host 已知的 session id 与 workspace id,不接受路径或命令参数。
- 不执行 shell 命令;文件操作只作用于
sessionPersistence.locate/ 受控扫描推导出的会话目录。 - 日志只记录 action、session id、workspace id 和结果码,不记录标题、消息或路径全文。
开发
npm test # node --test,26 个单元/集成测试
node --check index.js client.js lib/*.js
npm --cache /tmp/dsh-npm-cache pack --dry-run
实机验收:安装到 desktop profile → 确认 settings.section 出现 session-mng-section → 用一次性测试会话验证标题/归档/恢复/移动/删除 → 清理测试数据。0.1.1 的列表验收见 docs/RELEASE-CHECKLIST-0.1.1.md。
当前状态与下一步
0.1.1已发布到 npm / GitHub / Release;26 个测试全绿,31 个文件。- 市场 PR #9672 等 1 天仓库年龄 gate,之后等维护者合并。
- 下一项主任务:0.2.0 Host 侧 overview + 分页 sessions,为 1000–10000 条会话设计;详细任务、验收标准、环境坑见 接手说明。
文档索引
License
MIT © 2026 ZilongYang
No comments yet. Be the first to write one.