dsh-sess
DeepSeek Harness(DSH)会话管理全局插件 —— 原生 Web UI、通过 profile 挂载、零源码修改。
dsh-sess is a global session-management plugin for DeepSeek Harness (DSH).
It adds a "Delete session" entry to every sidebar session ellipsis menu and an
"Archive manager" to every workspace ellipsis menu (rename / restore / delete
archived sessions). Native UI, mounted via the web profile, no DSH source
changes. Topic: dsh-plugin.
功能
- 侧边栏会话条目 · 删除会话 每条会话条目的省略号菜单(原有:重命名 / 复制 / 归档)新增「删除会话」, 点击后弹出原生确认框,确认后删除该会话的完整日志、工作区记账与归档记录。
- 工作区条目 · 归档管理
每个工作区(项目)条目的省略号菜单新增「归档管理」,打开原生归档管理器:
- 列出全部已归档会话(标题 / 所属工作区 / 相对时间);
- 重命名 已归档会话(复用 DSH 原生重命名能力);
- 恢复 已归档会话(还原到正常工作区列表,保留原位置);
- 删除 已归档会话(与侧边栏删除同一套确认与删除流程)。
说明:DSH 原生只有「归档」(加入归档集合),没有恢复接口。dsh-sess 的恢复通过 storage-domain 直接更新 workspace 域全局状态实现,浏览器端由
host/archived-sessions-changed帧即时刷新。
兼容性
| 项 | 值 |
|---|---|
| DSH 版本 | 0.1.1-rc.1(浏览器端静态模块表含 ui-slots / ui-primitives 的版本) |
| 平台 | Windows / macOS / Linux(纯 Node,无原生依赖) |
| 挂载方式 | dsh.profile.bundles 或 --patch overlay,均不改 DSH 源码 |
安装(挂载到 web profile)
方式 A:profile bundle(推荐,长期生效)
从 GitHub 仓库安装到 profile(npm 会自动 clone 并执行
prepare构建lib/产物):cd ~/.dsh/profiles/web npm install github:youridol/dsh-sess # 或指定完整地址: # npm install https://github.com/youridol/dsh-sess.gitpnpm 布局的 profile 使用
pnpm add github:youridol/dsh-sess。 已发布到 npm 后可直接npm install dsh-sess。在
~/.dsh/profiles/web/package.json的dsh.profile.bundles追加"dsh-sess":{ "dsh": { "profile": { "bundles": [ "@deepseek-ai/dsh-base", "@deepseek-ai/dsh-web-app", "dsh-sess" ] } } }重启
dsh web。
方式 B:--patch overlay(临时验证)
dsh --profile web --patch ./path/to/dsh-sess/testing/overlay.yml
(需保证 dsh-sess 可从 profile 目录解析:npm install github:youridol/dsh-sess 后即位于 profile 的 node_modules。)
开发
npm install # 安装 devDependencies(esbuild/typescript/vitest)
npm run typecheck # 客户端 + 宿主端双类型环境检查
npm run test # 菜单注入器 jsdom 集成测试
npm run build # 产出 lib/index.js(宿主)+ lib/client.js(浏览器)+ lib/types
客户端与宿主端类型环境不同(DSH 的
Context合并在两侧不同),因此类型检查 拆成tsconfig.client.json与tsconfig.host.json两个项目。
工作原理(架构)
- 宿主端(
lib/index.js):在共享/api通道上拦截dshSess.*端点 (ctx.connection.rpc.intercept,authority: 'loopback'沿用 DSH 信任围栏)。dshSess.deleteSession:删除日志目录(含压缩产物)→ 解除工作区记账 → 清理归档集合;挂载中的会话拒绝删除(返回agent-busy)。dshSess.restoreSession:把会话 id 移出归档集合(domain.global.set)。
- 浏览器端(
lib/client.js):__ModuleLoader__闭包工厂产物,平台模块外置。- 捕获阶段监听行内按钮点击 + MutationObserver 观察菜单 portal,向会话行/工作区行 的省略号菜单末尾注入条目(克隆原生菜单条目类名,观感一致);
- 会话行身份经 React fiber 链解析(
props.node.id)并与会话列表快照交叉校验, 杜绝误删; - 删除确认框与归档管理器复用 ui-primitives 的
Modal/Button/Input原生组件。
已知边界(诚实说明)
- 挂载中的会话无法删除。DSH 的会话由创建方 fiber 持有(
AgentHandle.dispose是仅限创建者的能力),第三方插件没有公开途径安全拆除挂载中的会话;直接删除日志 会在下次落盘时重建(复活)。因此对挂载中的会话返回agent-busy并给出提示, 重启 dsh 后(所有会话变为冷会话)即可删除。 - 归档集合的恢复/清理与 workspaceRegistry 内存缓存存在短暂不一致(直接写域
存储所致,重启后自然一致)。浏览器端由
host/archived-sessions-changed帧驱动 正确集合;且归档列表总是与会话列表联表展示,被删会话的残留 id 不会显示。 - 错误码复用浏览器端
rpcErrorSchema封闭联合(session-not-found/agent-busy/internal),自定义错误码会被客户端校验拒绝——语义经message表达。
开源
本仓库以 dsh-plugin 为 GitHub 话题,便于 DSH 插件生态检索。
- 许可证:MIT
- 话题:
dsh-plugindeepseek-harnesscordis
License
MIT
No comments yet. Be the first to write one.