架构说明

August 21, 2026 · View on GitHub

数据源

插件直接读取平台磁盘状态,不依赖 cordis 会话服务(测试友好、宿主零耦合):

数据位置说明
活跃会话 id~/.dsh/storages/workspace.jsontables.workspaces[*].sessionIds归档会话保留槽位(平台设计,恢复归档用)
归档会话 id同上 → global.archivedSessionIdsworkspace 级全局集合
会话内容~/.dsh/sessions/<项目>/<id>/session.jsonl.zstd多帧 zstd 容器(rc.7 追加式),逐帧解码

运行时列表优先读取平台 workspaceRegistry 服务(内存实时状态),磁盘文件为兜底。

删除链路(为什么无需重启)

删除请求

  ├─① workspaceRegistry.archiveSession(id)  内存操作 + 广播
  │    └─ 侧边栏立即把会话从活跃区收走(host/archived-sessions-changed)

  ├─② 删除 ~/.dsh/sessions/<项目>/<id>/ 目录(数据彻底清除)

  ├─③ 修剪 workspace.json 标记(尽力而为;运行中的 DSH 可能覆盖)

  └─④ 列表读取过滤「目录不存在的会话」→ 残留标记不显示

第 ① 步解决「侧边栏立即可见」,第 ② ④ 步解决「数据真没了 + 列表干净」——两步缺一不可:只删文件不归档,侧边栏活跃区仍显示该会话(内存 sessionIds 未动);只归档不删文件,数据还在磁盘。

多帧 zstd 解码

rc.7 起会话日志按批次追加为独立 zstd 帧(ZSTD_e_flush 半帧 + 周期性收尾),整包 zstdDecompressSync 只能解出第一帧(通常只有会话头)。lib/zstd.js 实现帧扫描(解析帧头/块头定位边界)+ 逐帧解码,与 dsh-session-persistence-jsonl 的扫描逻辑一致;测试用 encodeSessionLog 构造同格式容器。

侧边栏注入(实验性)

平台会话菜单(dsh-client-ui-workspaceSessionNodeItem)为硬编码数组,无 slot 扩展点。src/client/sidebar-inject.tsx 用 MutationObserver 在菜单 portal(div[role=menu],凭「分叉/Fork」项识别会话菜单)出现时深克隆现有项、换垃圾桶图标、追加「删除对话」;会话定位靠打开菜单的行标题(menuOpen 类)反查插件列表桥。