Skip to content

dsh-session-eva-status

Verified

dsh-session-eva-status · v0.1.0 · MIT · Web UI

DSH Web UI plugin: colors sidebar Session rows by their official status — orange rail = pending interaction, red rail = the selected session, purple rail = finished but unviewed, static rainbow title = pinned. Reads official Client services only; no polli

Install

dsh plugin add dsh-session-eva-status

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Tags

Readme

dsh-session-eva-status

English | 中文

按官方会话状态给 DSH 侧栏会话行上色,配色是 EVA 风格。插件不拥有任何状态:只读客户端已有的事实,给每行写一个 data- 属性,再用一张注入的样式表给这个属性上色。

行状态 读的官方事实 画什么
有待处理交互(批准 / 提问 / 计划评审) uiSession.sessionStatus.pendingInteraction 橙 #FF5C1A 整行高左轨 + 1.6 秒呼吸
选中(主区域正开着这一个会话) sessions.list 快照里 retainedBy.mainView > 0 红 #FF3B30 整行高左轨,静态
跑完但没看过 …sessionStatus.completionUnread 紫 #7A4FD6 整行高左轨
置顶 workspaces.list 快照里 pinnedSessionIds 行标题文字变静态六色彩虹(background-clip: text),行本身不画轨
运行中 / 子智能体在跑 / 空闲 / 已归档 / 空白新会话 — 不画;官方的转圈点与归档灰化已经说清楚了

官方优先级是 等人 > 运行中 > 子智能体 > 完成未读。跑完但子智能体还在跑时,官方那行显示的是 ongoing 转圈,插件就不画、把转圈让过去,不把这行说成「跑完」。

插件自己的优先级是 等人 > 选中 > 子智能体让位 > 完成未读:要你动手的行压过你正在看的行;选中的行即使子智能体在跑也保留红轨——选中行不隐藏官方转圈,两种读法同时看得见。

配色背后的规则:形状负责表意,颜色与光效负责风格。 图钉与置顶优先排序完全留给官方,这里只给置顶行的标题文字换色,图钉本身不改样式、不加装饰。

安装

与同目录其他本地插件一样,作为 Profile 依赖:把包加进 ~/.dsh/profiles/<profile>/package.json(并加进该 profile 的 dsh.bundles)后重启 DSH,或用插件 CLI 指路径安装:

dsh plugin --profile <profile> add <path-to>/dsh-session-eva-status

配置

随包 cordis.patch.yml 插入 entry 时带上默认值,改那里即可:

字段 默认 含义
hideOfficialDot true 在 等人/跑完未读 两种行上隐藏官方状态点(由左轨替代)
breatheMs 1600 橙轨的呼吸周期(毫秒,≥ 200)
colors EVA 配色 覆盖 pending / selected / unread

配置不合法会当场抛错,不静默降级。

原理

  • 行锚点:[data-row-key="session:<id>"],由 @deepseek-ai/dsh-client-ui-workspace 渲染。
  • 标题锚点:置顶彩虹加在行内第 2 个子元素上。行首那格永远渲染,标题位次因此稳定,不必匹配官方哈希类名。
  • 状态源:客户端自己的 ctx.uiSession.sessionStatus(HostObservable<ReadonlyMap<SessionId, SessionStatus>>,含 running / pendingInteraction / completionUnread),外加 ctx.sessions.list 里的两件事:子智能体目录(判断官方的「子智能体运行中」)与 retainedBy.mainView > 0(官方行自己的 selected 就是这么算出来的);置顶集合来自 ctx.workspaces.list 的 pinnedSessionIds。不轮询、不嗅探事件、不需要宿主半边。
  • 行上画什么:状态只由左轨一条 ::before 伪元素表达,行自身的背景完全不动:官方 hover 与选中反馈照旧。左轨刻意不用 inset box-shadow:inset 阴影是贴着边框内缘的一条带,会跟着官方行的圆角一路拐弯,两端拐成朝右的大弯钩,看上去像中括号而不是一条直轨;绝对定位的伪元素不受行圆角裁剪,才是整行高、两端直角的一条直轨。
  • React 安全:标记写成 data-eva-state 属性(React 不管它,重渲染冲不掉),观察器只过滤 data-row-key,行挂载/卸载/换身份时重新对账。
  • 卸载即净:订阅、观察器、行属性、样式表、调试入口一起清掉。

致谢与参考

这里没有任何整段抄来的代码。下面逐条说明每个来源贡献了什么。

借用的代码手法

  • enterhalf/dsh-session-colorful-unread-pin-jobs — DSH Web 插件浏览器半边的骨架:window.__ModuleLoader__.load({ id, factory }) 信封与具名 apply / inject、用 [data-row-key^="session:"] 认会话行、用合并到一个微任务的 MutationObserver 在 React 重渲染后补画、以及给注入样式表预打标记(dataset.plugin / dataset.pluginCss)以免被兄弟插件的热重载认领并删除。它的 2 秒轮询、自建未读存储与标题渐变染色没有沿用。
  • dsh-ledger-cn(本机 C:\DSH\plugins\dsh-ledger-cn,未发布)— 本插件的包结构照它来:private: true、main: lib/index.js、. / ./client 一对导出、插入自己 Loader 行的 cordis.patch.yml,以及测试手法(在假 window.__ModuleLoader__ 与最小 DOM stub 之后加载浏览器束)。
  • Tencent/BrowserSkill — @wxg-prc-cpg/browser-skill-dsh-plugin — 外部包的 dsh 清单参照:dsh.bundle.patch、dsh.client.platform、dsh.client.inject 与 files 列表。

从官方 Harness 读到的契约(deepseek-ai/deepseek-harness)

  • packages/client/ui-workspace — 会话行的 DOM(data-row-key、行首 16px 格、标题、时间、图钉)、行自身几何(Rows.module.css:高 32px、border-radius: var(--dsw-radius-md))以及行内席位(SlotMap)的声明。
  • packages/client/ui-session — 本插件读的 ctx.uiSession.sessionStatus(HostObservable<ReadonlyMap<SessionId, SessionStatus>>)。
  • packages/client/ui-primitives — StateDot,它的状态集合定义了官方行点的含义。
  • packages/client/ui-schedule — 占用 sidebar.session.row.leading 与 sidebar.session.row.hover 席位的现成例子(尚未使用,留给计划中的 hover 读数)。

本包不含官方包的任何代码、样式或文案:插件只读它们渲染出来的 DOM 与公开的客户端服务。

已知限制

  • 隐藏官方点用行上的 > :first-child:等人/跑完未读 行的这个 16px 格里只有状态点(sidebar.session.row.leading 席只在行 idle 时渲染),所以今天不会误伤;若将来官方在该格放别的占用者,会被一起隐藏。
  • 归档行不画:官方已经把标题压到 caption 档,而且归档行的行首格本来就不画状态点。
  • 选中轨是叠在官方选中高亮(行自身背景)之上的加法,不是替换。
  • 置顶彩虹只染文字(background-clip: text),不往行里插 DOM;卸载时属性与规则一起消失。
  • 配色刻意不跟随主题品牌色;不给行铺底色,所以明暗主题下同一组颜色读起来一样。
  • 将来官方若改名 data-row-key,插件只是不再上色,不会影响别的功能。
  • 没有任何模型可见面:不注册工具、命令、提示词或上下文。

测试

node --test test/client.test.mjs

许可

MIT