DeepSeek Harness 会话惰性查看器

前言

DeepSeek Harness(DSH)运行后会在 ~/.dsh/sessions 下写入会话文件,通常是 session.v3.jsonl.zstd 或 session.v4.jsonl.zstd 等多帧 zstd 压缩文件。查看最近发生的事件时,传统方式往往需要解压整个文件,对大文件既慢又费内存。

本插件是 DSH web 插件:会话惰性查看器(纯只读)。它列出 ~/.dsh/sessions 下全部会话(只做 stat 不解压),并可只解压任意会话文件的最后 1–2 个 zstd 帧,快速查看最近发生的事件,不触碰整份文件。

安装与启用

使用 DSH 官方插件命令安装:

dsh plugin --profile web add @240xu/dsh-session-lazy-view

安装完成后重启 DSH web 实例,直接访问 http://<dsh-web-地址>/lazyview 即可打开独立面板页。

核心功能

会话列表与预览

  • 访问 /lazyview 打开 HTML 面板,按项目分组列出会话。
  • 列表仅做 stat(不读文件内容),文件大小超过 10MB 的行会标红。
  • 每行提供「tail」按钮,点击展开最近 2 帧,支持「上一页」翻页。
  • 列字段包括 sessionId、path、artifact、format、bytes、mtime 等。

帧级惰性读取

  • 使用 /lazyview/api/tail?path=<相对路径>&frames=2&skip=0 端点。
  • path 必须是 /api/list 返回的相对路径,且文件名以 session.v3.jsonl.zstd 或 session.jsonl.zstd 结尾。
  • 服务端从文件尾部读一个窗口,扫描帧魔数 0x28 B5 2F FD,只解压候选帧。
  • skip 参数用于翻页偏移(跳过最新 skip 帧后再取 frames 帧)。
  • 帧内事件已文本化(role + 截断到 2000 字符的 text / tool-call / tool-result)。
  • 解析失败(坏帧、旧格式、窗口截断等)返回 {ok:false, error:{code, message}} 结构化错误,不会导致面板 500。

会话搜索

  • 使用 /lazyview/api/search?path=&q=&max=20 进行会话内全文搜索。
  • 流式逐帧解压做大小写不敏感子串匹配,命中返回 {frameIndex, seq, type, role, snippet}(命中点前后各 60 字符窗口)。
  • 达到 max 截断,默认最多扫 500 帧,未扫完返回 partial:true。
  • 每帧之间调用 setImmediate 让出事件循环,客户端断开(AbortSignal)即中止扫描。

会话统计

  • 使用 /lazyview/api/stats?path=[&fast=1] 获取会话统计信息。
  • 不带 fast=1 时:帧数、总事件数、按 type 分组计数、首/末事件时间、文件字节数、session header。
  • 带 fast=1 时:仅流式扫描帧魔数(不解压),给出帧数与字节数,内存有界。

导出 Markdown

  • 使用 /lazyview/api/export?path=&frames=N 将最近 N 帧(≤20)导出为 Markdown 文本下载。
  • 文本在内存中生成直接响应,不写入任何文件。

Timeline 视图

  • 在会话打开视图中切换「时间线」视图,按 turn 分组展示正序事件时间线(vscode Timeline 式阅读投影)。
  • 分组规则:有 turn/start 事件时开启新组;历史格式以 user/message 为组边界。
  • 组默认折叠一行摘要,展开显示全部事件;折叠状态保存在内存中。
  • 支持深链:/lazyview?session=<id>&seq=<n> 自动打开会话、进入时间线、展开目标组并高亮首个 seq≥n 的事件。
  • 事件带有 surfaceOp(op:”replace”)时,被替换区间内的事件在时间线上渲染为半透明 +「已遮蔽」徽标(纯本地计算)。

已知限制

  • 旧格式 session.jsonl.zstd 为单帧,tail 读取没有惰性收益。
  • 尾部窗口默认 1MB,最多增长到 64MB;极端情况下单帧超过 64MB 时返回 truncatedScan: true 且可能少帧。
  • 帧魔数理论上可能出现在压缩数据内部造成假候选;假候选解压失败后以 per-frame error 呈现。
  • 事件文本化只覆盖已验证的形状(user/assistant/system message、tool call/result),其余事件类型输出紧凑 JSON 摘要。
  • 未做缓存,每次 tail 请求都重新读窗口,对调试场景足够。

适用场景与注意

  • 适合需要快速查看最近事件、对大会话文件做惰性读取的 DSH 用户。
  • 插件以当前 dsh 进程权限运行,读取 ~/.dsh/sessions,请确保安装前检查源码与许可证。
  • 面板是 /lazyview 独立页,DSH 宿主侧边栏没有入口是有意设计(纯只读工具),若安装了 dsh-devkit 可在 Ctrl+K 命令面板中打开。

总结

本插件通过扫描帧魔数、只解压候选帧的方式,在保持纯只读的前提下,提供会话列表、帧级 tail、全文搜索、统计与 Markdown 导出能力,并支持 Timeline 视图与深链跳转,是查看 DSH 会话的高效工具。

  • 目录页:https://www.skillhub.cn/plugins/240xu/dsh-session-lazy-view
  • GitHub:https://github.com/240xu/dsh-session-lazy-view
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜