DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Session Eva Status — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
S

dsh-session-eva-status

Session Eva Status

DSH Web UI 插件:根据 Session 的官方状态为侧边栏中的行着色——蓝色边条 = 等待交互,红色边条 = 已选中的 Session,紫色边条 = 已完成但未查看,静态彩虹标题 = 已固定。仅读取官方 Client 服务;不进行轮询,不涉及 host 端。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:WhatCannotBeSaid/dsh-session-eva-status#d498577bf80b95b5306edac7f7c1d361b5661a02
README兼容性版本

兼容性与来源证明

Session Eva Status 以 dsh-session-eva-status 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/8

版本

0.1.0stable
2026/10/8

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/8
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Experimental Agent Team Web Profile@deepseek-ai/dsh-experimental-agent-team-web-profile用于 Agent Teams Remote 和 UI 插件的实验性 Web 配置层Ab Chartdsh-ab-chart带有绘制其调用的浏览器卡片的图表渲染工具,封装在一个可发布的插件包中Whale Widgetdsh-whale-widgetDSH Web 界面右下角的 DeepSeek 余额小鲸鱼挂件:余额/今日已用/峰谷定价、自定义泡泡点击序列(文本/余额/今日/峰谷/图片/随机语句与并列加权选择)、逐行样式与字体、悬浮快捷编辑、音效与每轮消耗、自定义角色/动图/音效、吸附与翻转自定义

README

dsh-session-eva-status

English | 中文

Colors DSH sidebar Session rows by their official UI status, in an Evangelion-flavored palette. The plugin owns no state: it reads facts the Client already has, writes one data- attribute per row, and styles that attribute from a single injected stylesheet.

Row stateOfficial fact it readsDecoration
Pending interaction (approval / question / plan review)uiSession.sessionStatus.pendingInteractionblue full-height left rail + 1.6 s breathing. Two blues, one per mode, both from card C ("Newtype" cover): dark #AAC7EF, light #3F629C
Selected — the session open in the main viewsessions.list snapshot: retainedBy.mainView > 0red full-height left rail, static. Two reds, one per mode: dark keeps #FF3B30, light overrides it with the redder, deeper #E01B24
Finished but not viewed…sessionStatus.completionUnreadpurple #7A4FD6 full-height left rail
Pinnedworkspaces.list snapshot: pinnedSessionIdsthe row title becomes a static six-color rainbow (background-clip: text); the row itself gets no rail. Two palettes, one per mode: dark keeps the original six, light uses a darker six solved to ≥4.5:1 against the light wall
Running / subagents running / idle / archived / blank—nothing drawn; the official spinner and archived dimming already say it

The official priority is pending > running > subagents > completed. When a session has finished but its subagents are still running, the official row shows the ongoing spinner, so this plugin draws nothing and lets that spinner through instead of calling the row "finished".

The plugin's own priority is pending > selected > subagents (yields) > unread. A row that needs you outranks the row you happen to be looking at, and a selected row keeps its red rail while its subagents run — the official spinner is not hidden on selected rows, so both readings stay visible at once.

The design rule behind the palette: shape carries meaning, color and light carry style. The pin icon and the pinned-first ordering stay entirely official — only the pinned row's title text is re-colored, so the pin itself is never restyled or decorated.

The rainbow is mode-scoped, because the same mid-luminance stops do not survive both backgrounds: on the light theme's wall (measured luminance 0.405–0.658 under the pinned titles) the original six score only 1.15–3.63:1, while on the dark theme's wall they are fine. Dark therefore keeps the original six colours unchanged, and light uses six darker stops of the same hues in the same order, each clearing 4.5:1 against the darkest patch measured under the title. The split is read from DSH's own dark marker (body[data-ds-dark-theme], theme-presenter.ts), not from any theme-specific hook.

The pending rail is mode-scoped for the same reason. Its blue comes from card C (the "Newtype" cover reference), which carries two blues: #3F629C (slate blue — 5.84:1 on the light wall but only 2.82:1 on the dark one) and #AAC7EF (pale blue — 9.94:1 on the dark wall but only 1.66:1 on the light one). Neither survives both, so each mode takes the one that reads on its own wall: light #3F629C, dark #AAC7EF. Both tiers share one @keyframes: the rail reads its colour through a custom property (--dsh-session-eva-status-pending), and the light rule overrides only that property, so the breathing period, easing and low point stay byte-for-byte identical and only the colour changes.

The selected rail is mode-scoped for the same reason. #FF3B30 keeps a high green channel (59) and scores only 3.39:1 on the light wall; light overrides the colour alone with the redder, deeper #E01B24 — hue rotated past pure red (HSL 357.3°), green cut from 59 to 27 — which clears 4.62:1. Dark is byte-for-byte unchanged. The override is one extra rule scoped by body:not([data-ds-dark-theme]) that sets background and nothing else, so the rail's geometry, stacking and lack of animation are untouched.

Install

The plugin is a Profile dependency, like the other local plugins in this directory. Add it to ~/.dsh/profiles/<profile>/package.json (and to that profile's dsh.bundles list) and restart DSH, or use the plugin CLI with the package path:

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

Config

The shipped cordis.patch.yml inserts the entry with these defaults; edit them there.

FieldDefaultMeaning
hideOfficialDottrueHide the official status dot on pending and unread rows (their left rail replaces it)
breatheMs1600Breathing period for the pending rail (ms, ≥ 200)
colorsEVA paletteOverride pending / pendingLight / selected / selectedLight / unread. pending and selected are the dark-mode values; pendingLight and selectedLight are the light-mode overrides

A malformed config throws at load; nothing is silently skipped.

How it works

  • Row anchor: [data-row-key="session:<id>"] — rendered by @deepseek-ai/dsh-client-ui-workspace.
  • Title anchor: the pinned rainbow is applied to the row's second child. The leading 16 px cell is always rendered, so the title's position in the row is stable and no hashed CSS-module class name has to be matched.
  • Status source: ctx.uiSession.sessionStatus, the Client's own HostObservable<ReadonlyMap<SessionId, SessionStatus>> (running, pendingInteraction, completionUnread), plus ctx.sessions.list for two more official facts: the subagent catalog that decides the official "subagents running" state, and retainedBy.mainView > 0 — the same fact the official row's own selected flag is computed from. The pinned set comes from ctx.workspaces.list (pinnedSessionIds). No polling, no event sniffing, no host half.
  • Row paint: the state is carried by a single ::before pseudo-element rail, and the row's own background is left completely alone — so official hover and selection feedback is untouched. The rail is deliberately not an inset box-shadow: an inset shadow is a band hugging the border's inner edge, so it follows the row's own border-radius all the way around and curls into a right-facing hook at each end — it reads as a bracket, not a rail. An absolutely positioned pseudo-element is not clipped by the row's radius, so the rail is one straight, square-ended bar spanning the full row height.
  • React-safe: the marker is a data-eva-state attribute React does not manage, so re-renders cannot wipe it; a MutationObserver filtered to data-row-key re-reconciles when rows mount, unmount or change identity.
  • Uninstall is clean: subscriptions, observer, row attributes, stylesheet and the debug handle all go away with the plugin fiber.

Credits and prior art

Nothing here was copied wholesale. This list states exactly what each source contributed.

Code techniques borrowed

  • enterhalf/dsh-session-colorful-unread-pin-jobs — the browser-half shape for a DSH Web plugin: the window.__ModuleLoader__.load({ id, factory }) envelope with named apply / inject, decorating Session rows through [data-row-key^="session:"], re-applying after React re-renders with a MutationObserver coalesced into one microtask, and pre-tagging the injected stylesheet (dataset.plugin / dataset.pluginCss) so a sibling plugin's hot reload cannot claim and delete it. Its 2-second polling, its own unread store and its title-gradient painting were deliberately not reused.
  • dsh-ledger-cn (the local plugin package in C:\DSH\plugins\dsh-ledger-cn, unpublished) — the package layout this plugin follows: private: true, main: lib/index.js, the . / ./client export pair, a cordis.patch.yml that inserts its own Loader row, and the test style of loading the browser bundle behind a fake window.__ModuleLoader__ with a minimal DOM stub.
  • Tencent/BrowserSkill — @wxg-prc-cpg/browser-skill-dsh-plugin — the reference for an external package's dsh manifest: dsh.bundle.patch, dsh.client.platform, dsh.client.inject, and the files list.

Contracts read from the official Harness (deepseek-ai/deepseek-harness)

  • packages/client/ui-workspace — the Session row DOM (data-row-key, the leading 16 px cell, title, time, pin), the row's own geometry (Rows.module.css: 32 px tall, border-radius: var(--dsw-radius-md)) and the SlotMap declaration of the row seats.
  • packages/client/ui-session — ctx.uiSession.sessionStatus, the HostObservable<ReadonlyMap<SessionId, SessionStatus>> this plugin reads.
  • packages/client/ui-primitives — StateDot, whose states define what the official row dot means.
  • packages/client/ui-schedule — the worked example of occupying sidebar.session.row.leading and sidebar.session.row.hover (not used yet; kept for a planned hover readout).

No code, stylesheet or copy from the official packages is bundled here: the plugin reads their rendered DOM and their public Client services only.

Known limitations

  • Hiding the official dot uses > :first-child on the row. In a pending or unread row that 16 px cell holds only the status dot (the sidebar.session.row.leading seat renders only while the row is idle), so nothing else is affected today — a future DSH that puts another occupant there would have it hidden too.
  • Archived rows are left alone: the official UI already dims their title, and an archived row shows no status dot there anyway.
  • The selected rail is an addition on top of the official selection highlight (the row's own background), not a replacement for it.
  • The pinned rainbow is text-only (background-clip: text), so it needs no extra DOM: nothing is inserted into the row, and uninstalling removes the attribute and the rule together.
  • The palette is deliberately theme-independent (EVA colors, not theme brand colors) and no row background is tinted. Every colour comes from that one palette; where a single value cannot clear both walls, the mode that needs it takes the sibling stop instead — that is the case for the pending blue (two card C blues, one per wall) and the selected red (a redder, deeper light-tier red), and the rainbow's light tier is solved the same way (see above).
  • If a future DSH renames data-row-key, the plugin stops decorating rows and nothing else breaks.
  • No model-visible surface: the plugin registers no tool, command, prompt or context.

Test

node --test test/client.test.mjs

License

MIT