跳到主要内容

dsh-session-manager

已验证

@dachengge/dsh-session-manager · v0.1.1 · Apache-2.0 · Web 界面

DSH 会话管理插件(dshm):设置页「会话管理」面板 + 3082 端口上的完整 dshm 界面(会话列表/全文搜索/每步 token 趋势/导出/归档)。

安装

dsh plugin add @dachengge/dsh-session-manager

用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。

源码

发布到 npm 但没有公开仓库。安装前请检查包内容。

标签

说明文档

@dachengge/dsh-session-manager

DSH 会话管理插件:把原本独立的 dshm 网页(单独进程 + 127.0.0.1:8787)统一到 DSH 自身端口上, 并在设置页提供一个「会话管理」面板,与 DSH GUI 融为一个界面。

提供什么

形态 位置 说明
设置页面板 DSH → 设置 → 会话管理 概览卡片、会话表、全文搜索、详情(含每步 token 趋势图)、导出、归档
完整界面 DSH 端口下的 /dshm 原 dshm 单页应用(会话表格 / 搜索 / 详情抽屉 / 趋势图 / 导出),由 host 半区直接伺服,不再需要 8787

数据全部来自 $DSH_HOME(只读为主):

文件 用途
storages/workspace.json 工作区注册表、会话分组、归档集合
storages/session_projcache.json 会话投影:标题、统计、token、上下文、权限、目标、待办
settings.yaml 默认模型等设置
sessions/*/session.jsonl.zstd 会话日志(全文搜索 / 趋势 / 导出)

唯一的写操作:archive / unarchive(原子替换 workspace.json,保留其余字段)。 建议在 GUI 空闲时归档,避免与正在运行的 Web GUI 竞争写入。

注册的路由

都挂在 DSH 自己的端口下(默认 http://127.0.0.1:3082):

GET  /dshm                                完整界面(原 8787 那份单页)
GET  /dshm/api/overview                   概览 + 会话表 + 工作区表
GET  /dshm/api/session?id=<id|前缀>        单个会话详情
GET  /dshm/api/search?q=&all=&reasoning=   跨会话全文搜索(默认不含归档、不搜推理)
GET  /dshm/api/trend?id=<id>               每步 token 用量序列
GET  /dshm/api/export?id=&format=md|json   导出可读会话记录
POST /dshm/api/archive?id=&archived=true|false

安装

# 本地开发(link 到工作区里的源码)
dsh plugin --profile web add link:C:/Users/43594/Desktop/harness中心/工具/dshm-plugin
# 改完代码后同步核心并重启 DSH 生效
node 工具/dshm-plugin/sync-core.mjs

发布到市场前先跑 node sync-core.mjs(把 ../../dshm/lib 的核心内联进 lib/core,保证包自包含), 再 npm pack --dry-run 复核、npm publish --access public。

目录结构

dshm-plugin/
├─ lib/index.js        host 半区:路由 + 完整界面伺服(/api/ → /dshm/api/ 改写)
├─ lib/client.js       浏览器半区:设置页「会话管理」面板
├─ lib/core/           内联的 dshm 核心(sync-core.mjs 生成,勿手改)
│   ├─ home.js         主目录解析(--home > DSH_HOME > ~/.toa3 > ~/.dsh > WorkBuddy)
│   ├─ store.js        读 workspace / projcache / settings 并归一化
│   ├─ logs.js         会话日志读取(异步并发解压 + mtime 增量 + transcript 缓存)
│   ├─ commands.js     会话/状态/用法等派生逻辑 + Markdown 渲染
│   ├─ format.js       ANSI 颜色 + CJK 宽度排版(CLI 侧复用)
│   └─ web/index.html  完整界面单页
├─ sync-core.mjs       从 ../../dshm/lib 同步核心
├─ test-smoke.mjs      host 半区冒烟(mock ctx,覆盖 8 条路由)
├─ test-client.mjs     客户端半区冒烟(mock React + slot 注册)
└─ dsh.plugin.json / cordis.patch.yml

性能说明

会话日志是「一个 header frame + 每批 append 一个 frame」的 zstd 帧拼接,实测 9 个会话共 7.3 万帧 (单个文件最多 6 万帧),且 Node 的 zstd 只解第一帧,必须逐帧解。因此:

  • 解压走 promisify(zstdDecompress) + 16 并发(串行 await 会被线程池往返拖到 2 倍耗时), 不阻塞 host 事件循环——这是它能安全跑在 DSH 进程内的前提;
  • 结果按「文件 mtime+size」缓存成 transcript + trend,重复请求 0ms;
  • 会话 id → 日志路径做成一次遍历的索引,避免每个会话重走目录树。

实测(9 会话 / 7.3 万帧):搜索冷启动 ~2.6s、热 6ms;趋势冷 ~3.0s、热 7ms; 5 个并发搜索合计 29ms(旧同步实现为 11.5s,且会把整个服务堵住)。