DeepSeek Harness Plugin Hub

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

探索

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

社区

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

相关链接

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

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

Event Relay — DeepSeek Harness 插件(DSH Plugin)
← Plugins
E

dsh-event-relay

Event Relay

事件中继:通过一个共享的 SSE 通道,将主机端事件推送到已订阅的浏览器界面。帧携带可选的 JSON 负载——一些插件将其用作纯变更信号(类似门铃,重新获取自身的真实状态),其他插件则直接使用该负载(通知、看板更新)。客户端使用已订阅主题前缀的并集打开流(服务端过滤),并通过 __relay/open 发出重连信号。

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

npx -y @deepseek-ai/dsh plugin --profile web add github:joao-paulo-santos/dsh-event-relay#f8150cf25f322b8a4d0f0ef3ff8db5d86f2153dd
README兼容性版本

兼容性与来源证明

Event Relay 以 dsh-event-relay 发布,当前版本为 0.3.1。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

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

版本

0.3.1stable
2026/8/26
0.3.0stable
2026/8/25
0.2.0stable
2026/8/24

相关插件

正在加载相关插件…

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

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

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

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

认领这个 Plugin →
报告问题
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录

README

dsh-event-relay

A DeepSeek Harness (DSH) plugin: install it into a profile alongside your own plugins.

Push from host to browser. The host can start a conversation; every other channel (fetch, RPC) requires the browser to ask first. If your plugin's UI should react the moment something happens host-side (a setting changed, a build finished, a notification arrived), this is that channel.

One shared SSE route (/relay/events) holds every subscriber's response open and streams JSON messages {"topic","payload"} as things happen. One connection per browser tab, no matter how many plugins subscribe.

Architecture

flowchart LR
    subgraph HOST["🖥️ Host, dsh-event-relay (host half)"]
        P["publish(topic, payload)"]
        N["notifyClients<br/>filter per client"]
        W[("/relay/events<br/>held-open responses")]
    end
    subgraph WIRE["⇄ SSE"]
        direction LR
        M["data: {topic, payload}<br/>...one message per event..."]
    end
    subgraph BROWSER["🌐 Browser tab, dsh-event-relay (client half)"]
        C["eventRelay service<br/>subscribe(topic, listener)"]
        S["notifyListeners<br/>fan-out per topic"]
        L1["plugin A listener"]
        L2["plugin B listener"]
        L3["plugin C listener"]
    end
    P --> N --> W
    W --> M
    M --> C
    C --> S
    S --> L1
    S --> L2
    S --> L3

Plugin value proposition

alternativefalls short
pollinglatency + waste (N fetches to learn "nothing changed")
refetch on focus/navigationfree and correct, but updates only when the user acts
your own EventSource/WebSocket per pluginthe browser caps ~6 connections/domain (HTTP/1.1); a few plugins permanently occupy them and every other request queues. This shared stream is one connection for the whole tab
host RPC (/api)request→response: the frontend can ask, but the host cannot interrupt

One direction, on purpose. Browser→host is transaction-shaped (command → reply): use plain HTTP (a route your host half registers) with status codes, validation, and error handling the stream doesn't have. Host→browser is notification-shaped: unpredictable moments, all tabs at once. Different jobs, different roads.

How to install

Requires a DeepSeek Harness checkout and a profile (here web):

# from the harness checkout
pnpm dsh plugin --profile web add /path/to/dsh-event-relay

# verify the profile still composes
pnpm dsh --profile web --dump-config

Then (re)start the harness; the host half loads at boot. Browser plugins consume the client service with ctx.get('eventRelay'), nothing to wire up beyond installing this package.

Producers (host plugins)

const relay = ctx.get('eventRelay')            // optional, degrade if absent
relay.publish('my-topic', payload)             // direct
ctx.on('my/event', (data) => relay.publish('my/event', data))   // mirror a Cordis event (do this in your plugin)

Consumers (browser bundles)

const relay = ctx.get('eventRelay')            // provided by this package's client half
const unsubscribe = relay.subscribe('kanban', (topic, payload) => { ... })
// or raw: new EventSource('/relay/events?topics=kanban,notifications')

payload in the callback is whatever the publisher passed. Apply it directly or ignore it and refetch your own truth, both are first-class styles.

Topic filtering: a subscription matches its exact topic and any child topic ('kanban' matches 'kanban/change'). The browser's connection URL carries the union of the tab's topics, so the server only sends what this tab listens for. When the last listener of the tab unsubscribes, the connection closes.

On every (re)open of the stream, subscribers of the synthetic topic __relay receive '__relay/open'. Consumers that apply state from messages use it to resynchronize: anything missed while the stream was down is recovered by one refetch.

Design

Transport, not a bus: Cordis events remain the host-side event system; this only carries messages across the plane boundary.

Payload is optional, not doorbell-only. Some plugins use the relay purely as a change signal, a topic-only message that tells them to refetch their own truth. Others consume the payload directly: the notifications demo pushes the notification itself, a kanban board pushes change messages. publish(topic, payload): send whatever is useful. Doorbells are one usage style, not the contract.

Liveness, not correctness: the relay may be absent, and a consumer should fall back to pull-on-focus (or pull on __relay/open) rather than depend on the stream for state. Route roots are composition-level contracts (/api, /plugins, /workspace-history, /notifications, /granular-settings are taken).

Debugging

The wire can be listened to from a terminal. Very useful to verify publishes end-to-end without a browser:

curl -N 'http://127.0.0.1:3080/relay/events'

Add ?topics=<prefixes> to mirror a client's filter; -N makes curl stream instead of buffering.

Dependencies

None

Plugins dependent on this

  • dsh-granular-settings publishes doorbell-only change notifications for its scoped settings platform

相关插件

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

Im@xmanrui/dsh-im将十一种 IM 渠道和一个公网 AI Office 接入本地 DeepSeek Harness。DSCODE@toddzheng024/dscode-bundle完整的 DeepSeek 编码代理,支持持久化 shell、Ultra 协作和自动权限审查。Acp App@deepseek-ai/dsh-acp-appdsh ACP 配置文件包:基于 dsh-base 的仅限自动化的 JSON-RPC stdio 和进程生命周期管理Im Connect@michengai/dsh-im-connectDeepSeek Harness IM 助理:把本机 agent 接到微信、企微、钉钉、飞书、QQ、Telegram,会话与网页任务分列。