dsh-recent:为 DSH Web 侧边栏补上「最近」时间线

前言

DeepSeek Harness(DSH)的 Web GUI 左侧边栏默认只有「工作区」视角:按文件夹展开项目,再在项目下找会话。刚在 A 项目里聊完,切到 B 项目后想回到刚才那条会话,得先想起它在哪个工作区、再展开对应文件夹。Codex 类产品的侧边栏常见两个视角——项目(文件夹)和最近(按时间平铺)——DSH 原生只有前者。社区插件 dsh-recent(维护者 ttmouse,分类:客户端)在「工作区」列表下方增加 最近 区块,把各工作区里最新的会话打散成一条时间线,并顺带把工作区列表默认折叠到「最近有记录」的五个文件夹。下面介绍它做什么、怎么装、使用时要注意什么。

这是什么

dsh-recent 是 DSH Web GUI 插件:注册到侧边栏既有槽位,在工作区树与设置之间渲染 最近 区块。数据与会话操作走框架标准套件(useSessions / useWorkspaces 等)和外壳公开的 uiWorkspace 服务,不修改 DSH 前端源码。项目托管在 GitHub:ttmouse/dsh-recent;社区目录页:skillhub.cn/plugins/ttmouse/dsh-recent。DSH 生态强调「一切皆插件」,SkillHub 等目录为社区站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

平铺时间线

跨工作区收集全部有历史的会话,按更新时间排成平铺列表,不限条数,不受上方项目是否折叠影响。默认先渲染一页(20 条);滚到已渲染部分末尾时自动再取一页,直到历史铺完。区块落在工作区列表自己的滚动区里,整栏一条滚动条,从工作区树一路滚进「最近」再滚向更早的会话——没有折叠钮,也没有内层滚动条。

行与浮层对齐外壳

每一行的尺寸、间距、圆角、悬停与当前高亮取自外壳会话行(32px 行高、--dsw-radius-md、--dsw-alias-interactive-bg-hover 等)。可见元素包括 16px 状态格、标题、距今时间(10px 三级色)、置顶标记;等待你响应时时间格换成「待审批 / 计划待审 / 待回答」。悬停时时间与置顶标记让位给行操作(⋯ 菜单、归档、置顶),与工作区树同一套图标与间距;悬停高亮画在单独一层上,左右各缩进 4px,行本身不位移、无 transition。

浮层使用 @deepseek-ai/dsh-client-ui-primitives 的 HoverCard,与会话卡片一致:完整标题、距今时间、运行状态;另多一行「文件夹图标 + 项目名」,便于跨项目区分同名会话。点击卡片可复制标题。时间分档用外壳导出的 relativeTime,每 30 秒刷新,与工作区树读数一致。

可见性规则与工作区树一致:归档会话不显示;子代理会话归父会话目录;空白占位会话不显示。

工作区与会话的默认折叠

工作区列表默认只展示 最近有记录 的 5 个文件夹(每个分组按各自最新会话时间参与比较;无记录的分组不占默认名额),其余折在「展开其余 N 个工作区」一行后面,折叠钮样式与外壳一致。展开是临时状态:收起侧栏再展开会回到默认折叠。

每个项目下的会话行同样只留按更新时间最新的 5 条(不看运行中/等待响应是否额外占名额——比第五名更旧的运行中会话也会被折起)。多出的会话折在一行;若外壳已渲染「展开其余 N 个会话」则沿用,否则插件补一行同款。点击外壳的展开钮会同时放开插件层的会话折叠。

显示范围与其它行为

仅在 宽栏 侧栏显示;56px 图标栏(wide: false)下本区块渲染为 null。归档仍在运行的会话时,宿主会拒绝,插件弹出与外壳同款「停止并归档此会话?」确认后先停后归档。⋯ 菜单含置顶、分叉、归档,不含重命名(入口在外壳内部 store,插件拿不到)。

安装与启用

插件以当前 dsh 进程权限运行,安装前建议在 GitHub 阅读源码与 MIT 许可证。

在跑 GUI 的 profile 目录(通常是 ~/.dsh/profiles/web)执行:

dsh plugin --profile web add github:ttmouse/dsh-recent

该命令会把依赖写入 profile 的 package.json,并把 dsh-recent 追加到 dsh.profile.bundles。bundle 列表在启动时读取,改完后需重启 Web GUI 并刷新页面:

# 停掉当前的 dsh web,再重新启动
dsh web

本地改插件源码时可用 link: 指向克隆目录(会跟随改动),同样需重启 dsh web;热重载只覆盖已加载插件的源码变更,bundle 列表变更必须重启。

典型用法

安装并重启后,打开 DSH Web 宽栏侧栏即可看到工作区列表下方的 最近 区块。

  1. 回到刚离开的会话:不必先定位工作区,在「最近」里按时间找行,点击即通过 uiWorkspace.openSession 打开(同时清掉中间列选中的面板)。
  2. 区分跨项目同名会话:悬停行查看浮层中的「文件夹图标 + 项目名」。
  3. 处理等待中的会话:黄点表示等待你响应;行尾或浮层状态行会标明进行中 / 等待审批 / 计划待审 / 等待回答。
  4. 找更早的历史:在整栏向下滚动,接近已加载列表末尾时自动追加下一页 20 条;很久以前的会话仍建议在工作区树里用搜索,比滚到底更快。
  5. 展开被折叠的工作区或会话:点「展开其余 N 个工作区」或「展开其余 N 个会话」;侧栏收起再展开会恢复默认只显示 5 个工作区与「最近」第一页。

开发本插件时(非最终用户必做):在仓库内 pnpm install,改源码后须 pnpm run build,宿主加载的是 lib/client.js。

适用场景与注意

适合:经常在多个 DSH 工作区之间切换、希望用一条时间线快速跳回最近会话的 Web GUI 用户;希望侧栏默认更短、只突出最近活跃的几个文件夹时。

限制与依赖(来自 README「已知限制」):

  • 工作区与会话折叠依赖外壳 DOM(_groupSection、data-row-key="workspace:<id>" / session:<id> 等);外壳结构变更时折叠可能静默失效,退化为完整列表,一般不报错。
  • 折叠只决定谁留下,不重排工作区顺序;顺序仍由外壳列表决定。
  • 不做搜索、不能在最近行重命名;56px 导轨不显示本区块。
  • 会话很多时需滚动加载,无页码或跳转;标题为空时可能显示会话 id 等回退值。

插件当前 package 版本为 0.1.0,要求 Node ^22.19.0 || >=24.0.0。

结尾

dsh-recent 在不动 DSH 前端源码的前提下,为侧边栏补上 Codex 风格的「最近」视角,并与工作区树的会话行、卡片和操作保持一致;同时把工作区与会话列表默认裁到最近活跃的少量条目,减轻长列表负担。目录页:https://www.skillhub.cn/plugins/ttmouse/dsh-recent;源码与完整设计说明:https://github.com/ttmouse/dsh-recent。

羽毛球分组比赛记分
小程序二维码

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

小夜