dsh-session-mng
One Settings page for every DeepSeek Harness session: browse active and archived sessions by workspace, generate a title from the whole conversation for live or archived sessions, archive or restore, move a cold session to another workspace, and permanently delete an archived session (with its subag
Install
dsh plugin --profile web add dsh-session-mng
Sandbox test results
| Stage | Result |
|---|---|
| 1 install | ✓ |
| 2 list | ✓ |
| 3 mount | ✓ |
| 4 boot | — |
Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).
README
dsh-session-mng
官网 / Website: <https://dsh.zlmix.com/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 (thedesktopprofile 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、大小、最后活动时间、运行/已打开/已归档/已置顶/分支/子代理标记;支持搜索、工作区筛选、排序、刷新、批量选择。
- 分支会话默认显示:从某条会话分出来的会话(fork)和主会话一样可见、可管理——有来源记录时缩进挂在父会话下方,父行显示「N 分支」,分支行标注「↳ 来自:父标题」,搜索父标题也能找到它。DSH 0.2.2 起普通 fork 不再记录来源,这类分支显示「分支」徽标 + 「来源未记录」,不缩进,但可以像独立会话一样单独移动。由委派产生的子代理会话仍默认隐藏(勾选「显示子代理会话」查看),总览行会提示「已隐藏 N 个子代理会话」。
- 按工作区分页(Host 侧):首屏只取工作区概览(会话数/归档数/空会话数/大小占位),展开工作区才按 50 条一页向宿主取行,「加载更多」继续追加;会话数 >100 时默认折叠工作区;搜索自动展开命中工作区。过滤工具栏和批量条整体吸顶。
- 万级会话可用:Host 新增零会话日志 IO 的 catalog(复用宿主的 header 索引与投影缓存),10000 条会话首屏 overview 约 10 ms / 约 1.3 KB,单页 50 行约 9 ms;
GET /state保留给 0.1.x 客户端与回退路径。 - 选择跟随可见集:切换筛选/折叠/搜索/刷新后,隐藏会话自动取消选择;
全选当前列表只作用于当前筛选与已展开的工作区。 - 空会话默认隐藏:侧栏本来就不显示的
blank会话,会话管理默认也不显示;勾选「显示空会话」才出现。提供「清理空会话(N)」快速清理已归档空会话。 - 删除范围模态确认:范围内容在弹窗内独立滚动,底部勾选与确认/取消按钮固定可见;支持遮罩点击/Esc 取消。
- 生成标题:选中任意会话(包括已归档的冷会话),让模型总结整段对话,给出可编辑的标题提案;确认后才写入。活跃会话走官方
sessionTitle.rename,冷会话按官方session/title事件形状追加,不需要恢复会话。 - 归档 / 恢复:调用官方
workspaceRegistry.archiveSession/unarchiveSession。运行中的会话先提示,用户二次确认后才停止并归档;恢复后回到原工作区原位置。 - 跨工作区移动(整枝):把冷会话真正迁移到目标工作区——改写会话日志 header 的
cwd、把日志目录迁到目标项目目录、同步 workspace 账本。根会话的子代理会话会一起搬走(它们的parentSession血缘保持不变),普通分支(fork)是独立会话,留在原工作区。整枝先整体校验(任一会话已打开/运行中就整体拒绝)、逐个迁移、失败按逆序整体回滚。SessionId、归档状态、pin 状态不变,事件字节不变。 - 彻底删除已归档会话:删除前先预览范围(根会话、子代理会话、目录、字节数);确认后把日志目录移出 store、清理归档集合与 workspace 账本,再删除。不可恢复。 子代理会话随父级联删除;普通分支会话不会(它们仍是独立会话,来源父会话删除后保留下来),如需一并删除请把分支也勾选进来。
- 预览最近消息:不恢复会话即可看最近 10 条用户/助手消息。
- 失效归档标记清理:归档集合里有、但磁盘上已无日志的 id,会以横幅提示并允许清理。
- 工作区归属自检 + 一键归位:左侧栏只渲染工作区账本里的会话,所以「右边能看到、左边栏看不到」这种不同步,根因通常是会话的
cwd属于某工作区但账本sessionIds里漏了它。会话管理页会检测这类会话:横幅提示 + 「一键归位」按钮(行上带「未归位」徽标,详情页也有同样按钮)。归位只写账本、不改会话日志,live/archived 都安全;若宿主自己的会话列表仍不返回它,会明确提示需要重启后再试。 - 中英双语、浅色/深色主题跟随宿主。
安装
桌面版(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 已于 2026-10-27 合并(check与Submission gate均通过)。dshmarket 读取同一份目录,卡片版本随 npm 自动更新,当前显示0.1.3。
使用
1. 打开 设置 → 会话管理。
2. 顶部 tab 切换 全部 / 活跃 / 已归档;用工作区下拉、搜索框、排序缩小范围。
3. 点任意会话进入详情:生成标题、打开、归档/恢复并打开、移动到其他工作区、彻底删除(仅已归档)。
4. 在列表里勾选多个会话可批量归档、恢复、移动、删除;批量删除也会先显示范围确认。
5. 所有写操作都要在界面里明确点击确认;标题提案本身不写任何数据。
它是怎么工作的
Settings page (client.js)
│ GET /session-mng/api/overview ← 首屏:只有计数,没有会话行
│ GET /session-mng/api/sessions?... ← 每个展开的工作区一页(≤50 行)
│ GET /session-mng/api/{search,session,blanks,misplaced,sizes}
│ GET /session-mng/api/state ← 0.1.x 兼容 / 老 Host 回退
│ POST /session-mng/api/{preview,title/propose,title/apply,archive,unarchive,delete/preview,delete,move,repair}
▼
Host route (lib/api.js) ──► service (lib/service.js)
├─ catalog : workspaceRegistry.headers + sessionProjectionCache(零会话日志 IO;seam 缺失回退 buildState 慢路径)
├─ state : buildState 慢路径 / sessionController + sessionQuery + workspaceRegistry + sessionPersistence
├─ title : sessionQuery.readSurface → ctx.llm.stream → 确认后写 session/title 事件
├─ archive : workspaceRegistry.archiveSession / unarchiveSession
├─ repair : 工作区账本自检 + attachSession(纯账本写,不改会话字节;cwd 校验)
├─ move : 日志 header cwd 重写 + 目录迁移 + workspace 缓存对账(失败全回滚)
└─ delete : 删除范围预览 → 目录移入临时区 → 清理账本 → 删除(失败回滚)
- 首屏是概览、行是分页:
overview只聚合内存索引;sessions每页最多 50 行,排序/分支嵌套在 Host 完成后再切片,idtie-break 保证翻页稳定。 - catalog 不落盘、不缓存会话:行从宿主已有的 header 索引与投影缓存读取;归档/移动/删除/改标题后只失效大小快照与慢路径缓存,下一次请求自然重建。
- 标题是日志事件:
session/title的source为user,与官方重命名一致;已归档会话不需要恢复 Agent。 - 工作区归属是派生的:由会话 header 的
cwd决定。移动必须改写 header,只改账本无效。 - 不碰事件正文:移动只重写日志第一个 frame(header),其余字节原样保留;移动后重新完整 replay 校验一次。
- 事务式删除/移动:目录先移出 sessions root 到同文件系统的临时目录,失败可回滚;成功后才删除临时副本。
- 零模型工具:不注册 agent tool、不注入系统提示词、不注册 title provider,正常对话的 token 开销为 0。
兼容性
项 · 说明
实测宿主 · DSH 0.2.2-rc.1(桌面 App,desktop profile,Web GUI);0.2.1-rc.5(全局 CLI)、0.2.1-rc.3、0.2.1-rc.2 也已验证
Node · >=20.3 可运行总览/标题/归档/删除;移动 需要 node:zlib 的 Zstandard 支持(Node >=22.15,当前 Desktop 运行时为 Node 24.21)
会话后端 · 移动/删除只支持本地 JSONL 后端(`sessionPer
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::10,最后更新 2026-11-05