dsh-workspace-insight:给 DSH Web UI 加一块工作区 / 会话活动看板

前言

用 DSH(DeepSeek Harness)做智能体开发的同行,一般都会攒下一堆工作区:每个项目、每次实验、每个临时想法各开一个。时间一长,「上次那个工作区还用不用」「哪个可以归档了」「哪个其实是周期性在跑」就没人记得清了,只能一个个点开对话框翻记录。

看板类工具不是没有,但多数要自己搭,或者要引入额外的数据库。本项目的思路是直接读 Host 已有的本地存储——工作区注册表、会话投影缓存、会话日志——在 Web UI 里算给你看。下面介绍的是 stone-beka/dsh-workspace-insight,一个客户端插件,维护者是 stone-beka,定位是只读、本地、无任何网络请求的活动洞察面板。

这是什么

一句话定位:给 DSH Web UI 加一块工作区 / 会话活动看板,回答「哪些工作区还活着、它们跑了哪些对话、花了多少时间、哪些可以放心归档」。

  • 形式:客户端插件(client),通过标准的 dsh.bundle.patch + dsh.client manifest 挂载,无构建步骤。
  • 数据:只读 $DSH_HOME 下的本地文件,不发任何网络请求。
  • 许可证:MIT。版本 0.2.1。

相比「打开每个工作区翻会话列表」的做法,它把所有工作区的活动压到一屏,并且按天给出分布,归档判断有明确规则(超过 20 天未使用且仍有会话,标记「建议归档」),而不是凭感觉。

核心功能

插件有三个视图,共用同一份只读数据。

总览

一行一个工作区,给出最近使用、会话数、轮次、模型+工具耗时、近 14 天触达柱。超过 20 天未使用且仍有会话的工作区自动标「建议归档」。点行展开会话,可直接打开 / 归档 / 取消归档。

另有「今日热力」:行左边缘一条工作区身份色,今天没动压到 30%,动过保留原色;行尾「今日 N」胶囊用绿色深浅表示今天在该工作区新开 / 再用的对话数(1–2 浅、3–5 中、6+ 深)。悬停「今日 N」会浮层列出今天用过的对话,超过 6 条折成「+N 个对话」。

月视图(月度热力日历)

每天一格,格子加高到 118px,网格最小列宽 86px,面板窄时横向滚动。

格子内部按一天中出现的工作区分段:每段宽度 = 当天该工作区的会话数占比,颜色 = 工作区的列色(混到 78% 保持柔和),段内用竖排文字写工作区名,宽度约 10px,窄段也能露出名字。

交互上,点彩色段直接筛选该工作区,点格子空白选中当天;筛选后其他工作区的段变暗到 22%,整月形状仍保留。悬停彩色段在格子下方弹出当天全部会话,整行可点跳转;悬停日期或空白不再弹浮层,完整列表在下方「当天记录」面板。

顶部有月度摘要:活跃天数、对话数、涉及工作区数、最长连续活跃天数、环比上月。也可以只看某个工作区,无记录时会明确提示而不是给一张空日历。

时间轴(连续日期矩阵)

行 = 日期,从最早记录(2026-08-14)到今天一天不落;列 = 工作区,整列有固有色(表头 12%、有数据格 8%、空格 3% 的同色相底纹)。列顺序按最近活跃分四段:7 天内 / 8–14 / 15–21 / 21 天以上,段内按最新会话创建时间新→旧。

格子里每条对话一个同色小圆点 + 标题,默认最多 3 条(+ N),有「显示全部」开关。缩放低于 80% 时进入小字模式,仍保留 9px 标题(最多 2 条 + + N)。点击对话切回对话面板并打开该会话。

缩放交互:滚轮只上下;左键拖动平移;Ctrl / Cmd + 滚轮缩放(40%–180%,锚在鼠标处);− / + 按 10% 微调。

安装与启用

插件发布在 npm,包名是 dsh-workspace-insight。安装命令必须用包名,不能贴 npmjs 网页链接——pnpm 会把网页 URL 当成 tarball 地址去下载,而 npmjs.com 的页面对非浏览器请求返回 403,报错会是 ERR_PNPM_FETCH_403 ... 403 Forbidden。

桌面版:打开「设置 → 插件 → 添加插件」,粘贴包名并安装,然后硬刷新:

dsh-workspace-insight

dsh web / CLI 用户:

dsh plugin --profile web add dsh-workspace-insight

注意事项两点。其一,桌面版的 desktop profile 由桌面应用独占管理,在终端里跑 dsh plugin --profile desktop ... 会被拒绝(error: profile "desktop" is managed exclusively by the Electron application),桌面版请走设置界面。其二,如果报错里跟着 No authorization header was set for the request,那是 pnpm 的附带提示,公共包不需要 token,忽略即可;只有 401 才需要配 token。

装完后左侧栏出现柱状图图标,点它把主区域切到「工作区洞察」;设置页里也能打开。右侧栏还注册了一个窄版标签页(只有月视图 + 时间轴)。

卸载:

dsh plugin --profile web remove dsh-workspace-insight

兼容性前提:需要 DSH 的 Web UI(dsh web 的 web profile 和桌面版的 desktop profile 都行),在 DSH 0.2.2-rc.1 上验证;Host 端解压会话日志需要 Node ≥ 20。插件直接读 Host 的会话存储,DSH 大版本若改动存储格式,插件显示警告条而不是给出错误数字。

装完左侧栏没有图标,一般是没硬刷新或插件行没启用——Ctrl/Cmd + Shift + R,再确认设置 → 插件中该行是启用状态。

典型用法

下面是基于插件文档的几条可复现操作。

  1. 打开左侧栏的「工作区洞察」图标,默认进入总览,滚动查看全部工作区。
  2. 在总览里展开一个超 20 天未使用但仍有会话的工作区,点归档完成清理;归档走 Client 的 uiWorkspace.archiveSession(),插件本身不写任何会话或工作区存储。
  3. 点某个工作区行的「今日 N」胶囊,浮层列出今天在该工作区用过的对话,确认今天到底动了哪些东西。
  4. 切到月视图,点某一天的彩色段筛选工作区,看这个月它的活动分布;再点「在时间轴看」跳到时间轴并只保留该列,顶部「显示所有列」可以还原。
  5. 在时间轴上用 Ctrl / Cmd + 滚轮缩放到 80% 以下,确认小字模式下仍能读出对话标题,而不是退化成色块。

刷新不是手动的:总览每 60 秒、月视图每 5 分钟最多重算一次,URL 加 ?refresh=1 可强制刷新。日活跃索引有磁盘缓存 $DSH_HOME/cache/workspace-insight/session-days.v2.json,按文件 size + mtime 增量更新,首次 5–10 秒,之后约 100–300 毫秒;删掉缓存会自动重建,这是插件唯一的写入。

数据来源与口径

插件只读三处 Host 数据:

来源 用途
$DSH_HOME/storages/workspace.json 工作区注册表、会话归属、已归档会话 id
$DSH_HOME/storages/session_projcache/sessions/*.json 标题、createdAt、轮次、llmMs/toolMs、token、最后提问时间
$DSH_HOME/sessions/**/*.zstd 会话日志(多帧 zstd),逐帧解压提取事件时间戳 → 每日活跃

隐私方面:不发任何网络请求,两条数据路由同时受 Host 的 connection.admit() 与同源请求头校验保护。

口径上需要注意几处:

  • 月视图统计的是「会话-天」——一个对话在 3 天里被用到,记 3 条,不是消息条数。
  • 日期按本机时区从事件 time 换算。
  • 统计覆盖所有有投影缓存的会话(文档中给出当前值 400 条 / 518 会话-天)。
  • llmMs/toolMs 是本地计时,不是计费口径。

适用场景与注意

适合需要在多个工作区之间来回切换、又没精力逐个翻会话记录的 DSH 使用者。它把「找哪个工作区在用、该归档谁」变成一个浏览动作,不需要额外记录自己的使用习惯。

插件以当前 DSH 进程的权限运行,能读会话日志和工作区注册表。「建议归档」只是基于最后使用时间的提示,删除前请再次确认,归档动作走界面按钮,插件本身不写存储。

安装前应先读一遍源码确认行为,并核对许可证(MIT)。插件读取的是本机数据,但任何会读写本地存储的第三方代码都值得自己审一眼。

结尾

dsh-workspace-insight 的价值在于把分散在注册表、投影缓存和会话日志三处信息里的活动视图收拢到 Web UI 的一屏之内:总览看全局,月视图按天看节奏,时间轴看连续历史。全部只读本地,不装监控也不外发数据。

  • 目录页:https://www.skillhub.cn/plugins/stone-beka/dsh-workspace-insight
  • GitHub:https://github.com/stone-beka/dsh-workspace-insight
羽毛球分组比赛记分
小程序二维码

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

小夜