dsh-workspace-insight
给 DSH Web UI 加一块工作区 / 会话活动看板:哪些工作区还活着、它们跑了哪些对话、花了多少时间、哪些可以放心归档。全部只读本地数据,不出本机。
English | 中文
安装
桌面版:打开「设置 → 插件 → 添加插件」,粘贴包名
dsh-workspace-insight
点安装,然后硬刷新(Ctrl/Cmd + Shift + R)。
dsh web / CLI 用户:
dsh plugin --profile web add dsh-workspace-insight
桌面版的
desktopprofile 由桌面应用独占管理,在终端里跑dsh plugin --profile desktop ...会被拒绝 (error: profile "desktop" is managed exclusively by the Electron application),所以桌面版请走上面的界面。两种方式都一定要用包名,不要贴
https://www.npmjs.com/package/...这种网页链接 —— pnpm 会把它当成 tarball 地址去下载,而 npmjs.com 的网页对非浏览器请求返回 403, 报错就是ERR_PNPM_FETCH_403 ... 403 Forbidden。
装完后左侧栏出现柱状图图标,点它把主区域切到「工作区洞察」;设置页里也能打开。
卸载:桌面版在「设置 → 插件」里移除;CLI 用
dsh plugin --profile web remove dsh-workspace-insight
兼容性与前提
- 需要 DSH 的 Web UI(
dsh web的webprofile 和桌面版的desktopprofile 都行);在 DSH0.2.2-rc.1上验证。Host 端解压会话日志需要 Node ≥ 20。 - 插件直接读取 Host 的会话存储(workpsace 注册表、投影缓存、会话日志)。DSH 大版本若改动存储格式,插件会显示警告条而不是给出错误数字。
安装报错排查
| 报错 | 原因 | 处理 |
|---|---|---|
ERR_PNPM_FETCH_403 ... Forbidden 或 E403 403 Forbidden - GET https://www.npmjs.com/package/dsh-workspace-insight |
安装时填的是 npm 网页地址,pnpm 把它当成 tarball 去下载,npmjs.com 的网页对非浏览器请求返回 403 | 改用包名 dsh-workspace-insight;如果 profile 的 package.json 里已经写进了这条 URL,先把它删掉(或改成版本号)再装 |
同一报错里跟着 No authorization header was set for the request |
公共包不需要 token,这句是 pnpm 的附带提示,不是失败原因 | 忽略;只有 401 才需要配 token |
profile "desktop" is managed exclusively by the Electron application |
桌面版的 profile 只能由桌面应用管理,终端里不能装 | 改用桌面版的「设置 → 插件 → 添加插件」 |
| 装完左侧栏没有图标 | 没硬刷新,或插件行没启用 | Ctrl/Cmd + Shift + R;设置 → 插件 → 确认这一行是启用状态 |
隐私
- 只读
$DSH_HOME下的本地文件;不发任何网络请求,数据不出本机。 - 唯一的写入是日活跃索引缓存
$DSH_HOME/cache/workspace-insight/,删掉会自动重建。 - 两条数据路由同时受 Host 的
connection.admit()与同源请求头校验保护。
维护
解决什么问题
- 工作区太多记不过来:一页看完 39 个工作区的最近使用、会话数、轮次、模型+工具耗时。
- 判断该归档谁:超过 20 天未使用且仍有会话的工作区会被标记「建议归档」。
- 判断该不该建定时任务:近 14 天触达图 + 会话列表,能看出哪些工作区是周期性在用。
入口
- 左侧栏图标(柱状图,和「插件」等面板并排):点一下把主区域切到「工作区洞察」页;再点对话切回去。这是 DSH 原生的面板导航方式(
main面板 +sidebar.panellist图标),侧边栏自己负责按钮和选中态,图标只负责画。 - 右侧栏的标签页仍然保留(注册为原生 tab 类型
workspace-insight,从右侧栏+打开)。 - 设置 → 工作区洞察 也仍然保留,作为完整版。
主区域版是宽版(总览 / 月视图 / 时间轴 三个标签都全);右侧栏窄版只放月视图 + 时间轴。
总览
- 39 个工作区一行一个:最近使用、会话数、轮次、模型+工具耗时、近 14 天触达柱。
- 超过 20 天未使用且仍有会话的工作区自动标记「建议归档」。
- 点行展开会话,可直接打开 / 归档 / 取消归档。
- 今日热力:每行左边缘一条工作区身份色(今天没动 → 压到 30%,看着接近白;今天动过 → 原色);行尾「今日 N」胶囊用绿色深浅表示今天在这个工作区新开 / 再用的对话数(1–2 浅、3–5 中、6+ 深);顶部有一行「今天 N 个工作区 · N 段对话(新开 N)」。
- 悬停「今日 N」:浮层列出今天在这个工作区用过的对话——时间、标题、是否今天新开,超过 6 条折成「+N 个对话」。
- 展开会话时,今天用过的对话浅绿底 + 左侧绿条,并标「今天 / 今天新开」(新开 = 该对话就是今天创建的)。
月视图
- 日历:每天一格,格子加高到 118px,网格最小列宽 86px(面板窄时横向滚动,保证名字放得下)。
- 格子里的空间分配:日期行独立占顶部,彩色段内缩 6px 边距、段间 3px 缝、4px 圆角,留出呼吸感;没有活动的日子是一块极淡的底。
- 格内左右按比例分段:每段宽度 = 当天该工作区会话数占比,颜色 = 该工作区的列色(混到 78% 保持柔和);段内用竖排文字写工作区名(宽度只要 ~10px,所以窄段也能露出名字),完整名字与数量看悬停预览。
- 点某个彩色段 = 直接筛选该工作区(再点取消),点格子空白处 = 选中当天。筛选后其它工作区的段变暗到 22%,整月形状仍然保留,不会只剩一列;表头出现「彩色且带 × 的筛选标签」,一键清掉。
- 星期表头沿用 7 色(周一红 → 周日紫,表头是同色淡底胶囊),周末格子有淡底、今天有描边高亮,日期数字按星期几标色。
- 只有一个悬停预览(不再有钉住的浮层):
- 悬停彩色段 → 在格子下方弹出预览,列出这个工作区当天的全部会话;每行右边有「打开 ›」,整行可点 = 跳转到那个对话;底部「只看这个工作区」「在时间轴看」。鼠标移开格子再离开浮层才收起。
- 悬停日期 / 格子空白不再弹浮层——当天忙不忙一眼能看出来,完整列表在下方「当天记录」里。这样从段往浮层移动时,指针经过格子的内边距和段间缝隙也不会打断预览。
- 点某一天 = 选中:日历高亮这一天,并把下方「当天记录」面板自动滚进视野——选中态只由面板承载,不再弹第二个浮层。
- 筛选某个工作区时,预览里其它工作区的条目变淡。
- 顶部月度摘要:活跃天数 · 对话数 · 涉及工作区数 · 最长连续活跃天数 · 环比上月(+N / -N / 持平)。
- 顶部可 只看指定工作区:选中后日历与摘要只统计该工作区,下方列出它本月全部对话;若该工作区本月无记录,会明确提示而不是给一张空日历。
- 点某一天 → 按工作区分组列出当天用过的对话,可打开 / 归档;每组右侧有 「在时间轴只看这个工作区」,一键跳到时间轴并只保留该列(时间轴顶部「显示所有列」可还原)。
- 月份可前后翻页,「回到本月」可直接跳回。
时间轴(连续日期矩阵)
- 行 = 日期,一天不落:从最早记录(2026-08-14)到今天连续 84 行,不再跳过空白天;月份首日有加粗分隔线,左侧日期列吸附。
- 周与周之间的分隔线:相邻两行不属于同一自然周时(周日在上一行、下周一在下一行之间)画一条 1px 虚线,行按"周"成组;月份首日仍是 2px 实线(比周线更重)。
- 同一星期几永远同一种颜色(周一→周日固定 7 色):日期数字、星期文字、左侧色条同色。
- 每一列 = 一个工作区,并且整列有固有色:表头色块 12%、有数据的格子 8%、空格子 3% 的同色相底纹,一眼能顺着列往下读。
- 列顺序:按最近活跃分
7 天内 / 8–14 / 15–21 / 21 天以上四段,段内有分隔条;段内按最新会话创建时间新→旧。 - 格子内容:每条对话一个同色小圆点 + 标题,默认最多 3 条(
+ N);显示全部开关可展开全部;空格子不再画点。 - 缩小也看得见字:缩放低于 80% 时进入小字模式——每条对话仍保留一行 9px 标题(最多 2 条 +
+ N),不会再退化成只剩色块;列头始终显示竖排工作区名。 - 悬停对话 → 浮层显示完整标题 + 工作区 + 日期;点击 → 切回对话面板并打开该会话。
- 交互:滚轮只上下;左键拖动平移(横竖都行);Ctrl / Cmd + 滚轮缩放(40%–180%,锚在鼠标处);
− / +可按 10% 微调。 - 选列
列 n/40 ▾:勾选要显示的工作区(全选 / 全不选),列色与排序不受隐藏影响。
数据来源(只读)
| 来源 | 用途 |
|---|---|
$DSH_HOME/storages/workspace.json |
工作区注册表、会话归属、已归档会话 id |
$DSH_HOME/storages/session_projcache/sessions/*.json |
标题、createdAt、轮次、llmMs/toolMs、token、最后提问时间 |
$DSH_HOME/sessions/**/*.zstd |
会话日志(多帧 zstd),逐帧解压提取事件时间戳 → 每日活跃 |
- 不写任何会话或工作区存储;归档动作走 Client 的
uiWorkspace.archiveSession()。 - 日活跃索引有磁盘缓存:
$DSH_HOME/cache/workspace-insight/session-days.v2.json,按文件 size+mtime 增量更新——首次 5–10 秒,之后 ~100–300 毫秒。 - 总览每 60 秒、月视图每 5 分钟最多重算一次(
?refresh=1强制刷新)。
口径与限制
- 月视图统计的是「会话-天」:一个对话在 3 天里被用到,记 3 条,不是消息条数。
- 日期按本机时区从事件
time换算。 - 统计覆盖所有有投影缓存的会话(当前 400 条 / 518 会话-天,最早 2026-08-14)。
llmMs/toolMs是本地计时,不是计费口径。
结构
package.json manifest:dsh.bundle.patch + dsh.client
cordis.patch.yml 插入 workspace-insight 行
index.js Host:registry/projcache 统计 + 会话日志日索引 + 两条 JSON 路由
client.js Client:settings.section 页面(总览 + 月视图),主题 token 内联样式
locale/{zh,en}.json 插件清单标题/描述
icon.svg 插件图标
No comments yet. Be the first to write one.