🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

事件中继 joao-paulo-santos/dsh-event-relay

DeepSeek Harness
joao-paulo-santos67 天前有提交已提供中文文档扫描:未发现敏感能力

让宿主主动推送通知,插件界面实时响应变化

25.3/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add joao-paulo-santos/dsh-event-relay
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:待复验
是什么
dsh 原生插件 · browser
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 67 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

事件中继:一条 SSE 通道把宿主侧通知推送给已订阅的浏览器界面(服务端按主题前缀过滤,__relay/open 重连信号)

README

由 DeepSeek 最新模型翻译生成
dsh-event-relay DeepSeek Harness(DSH)插件:把它和你的其他插件一起装进配置档。 从宿主推送到浏览器。 宿主可以主动发起会话;其他通道(fetch、RPC)都得等浏览器先问。如果你希望插件 UI 在宿主侧一有动静(配置变了、构建完成、通知到达)就立刻响应,那这条通道就是干这个的。 一条共享的 SSE 路由(/relay/events)把每个订阅者的响应挂住不关,事情一发生就推送 JSON 消息 {"topic","payload"}。每个浏览器标签页只占一条连接,不管有多少插件订阅。 架构 flowchart LR subgraph HOST["🖥️ Host, dsh-event-relay (host half)"] P["publish(topic, payload)"] N["notifyClientsfilter per client"] W[("/relay/eventsheld-open responses")] end subgraph WIRE["⇄ SSE"] direction LR M["data: {topic, payload}...one message per event..."] end
展开完整文档(README 剩余 1 节)
dsh-event-relay

DeepSeek Harness(DSH)插件:把它和你的其他插件一起装进配置档。

从宿主推送到浏览器。 宿主可以主动发起会话;其他通道(fetch、RPC)都得等浏览器先问。如果你希望插件 UI 在宿主侧一有动静(配置变了、构建完成、通知到达)就立刻响应,那这条通道就是干这个的。

一条共享的 SSE 路由(/relay/events)把每个订阅者的响应挂住不关,事情一发生就推送 JSON 消息 {"topic","payload"}。每个浏览器标签页只占一条连接,不管有多少插件订阅。

架构

flowchart LR
subgraph HOST["🖥️ Host, dsh-event-relay (host half)"]
P["publish(topic, payload)"]
N["notifyClientsfilter per client"]
W[("/relay/eventsheld-open responses")]
end
subgraph WIRE["⇄ SSE"]
direction LR
M["data: {topic, payload}...one message per event..."]
end
subgraph BROWSER["🌐 Browser tab, dsh-event-relay (client half)"]
C["eventRelay servicesubscribe(topic, listener)"]
S["notifyListenersfan-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

插件价值

| 替代方案 | 差在哪 |
| 轮询 | 有延迟又浪费(为了确认「什么都没变」要发 N 次请求) |
| 聚焦/导航时重新拉取 | 免费又正确,但只有用户操作时才更新 |
| 每个插件自己开 EventSource/WebSocket | 浏览器对每个域名限制约 6 条连接(HTTP/1.1);几个插件就把它们长期占满,其他所有请求都得排队。这条共享流整个标签页只占一条连接 |
| 宿主 RPC(/api) | 请求→响应:前端能问,但宿主没法打断 |

只做单向,是故意的。 浏览器→宿主是事务形态(命令→回复):用普通 HTTP(宿主侧注册一条路由),有状态码、校验和错误处理,这些流都没有。宿主→浏览器是通知形态:时机不可预测,所有标签页同时收到。不同的活,走不同的路。

怎么安装

需要一份 DeepSeek Harness 检出和一个配置档(这里叫 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

然后重启 harness;宿主侧在启动时加载。浏览器插件用 ctx.get('eventRelay') 消费客户端服务,除了装这个包,不用再接别的线。

生产者(宿主插件)

const relay = ctx.get('eventRelay') // optional, degrade if absent
relay.publish('my-topic', payload) // directjs
ctx.on('my/event', (data) => relay.publish('my/event', data)) // 镜像一个 Cordis 事件(在你的插件里做这件事)

消费端(浏览器打包产物) js const relay = ctx.get('eventRelay') // 由本包的客户端部分提供
const unsubscribe = relay.subscribe('kanban', (topic, payload) => { ... })
// 或者用原始方式:new EventSource('/relay/events?topics=kanban,notifications')

回调里的 payload 就是发布方传进来的内容。直接拿来用,或者忽略它、重新拉取你自己的真实数据,两种都是一等公民的用法。

主题过滤:订阅会匹配它的精确主题以及任意子主题('kanban' 匹配 'kanban/change')。浏览器的连接 URL 携带该标签页所有主题的并集,所以服务端只发送这个标签页监听的内容。当标签页最后一个监听者取消订阅时,连接关闭。

每次流(重新)打开时,合成主题 __relay 的订阅者都会收到 '__relay/open'。那些从消息里应用状态的消费端用它来重新同步:流断开期间错过的任何内容,都靠一次重新拉取补回来。

设计

是传输层,不是总线:Cordis 事件仍然是宿主侧的事件系统;这里只负责把消息送过平面边界。

payload 是可选的,不是只能当门铃。有些插件把中继纯粹当作变更信号,只发一条带主题的消息,告诉自己去重新拉取真实数据。另一些则直接消费 payload:notifications 演示推的是通知本身,看板推的是变更消息。publish(topic, payload):有什么有用的就发什么。门铃只是一种用法,不是契约。

要的是存活,不是正确:中继可能不存在,消费端应该退回到聚焦时拉取(或者在 __relay/open 时拉取),而不是把状态寄托在流上。
路由根是组合层级的契约(/api、/plugins、/workspace-history、/notifications、/granular-settings 已被占用)。

调试

可以从终端监听这条链路。不用浏览器就能端到端验证发布,非常有用:

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

加上 ?topics=<prefixes> 就能镜像客户端的过滤条件;-N 让 curl 流式输出而不是先缓冲。

依赖

无

依赖本插件的插件

- dsh-granular-settings 为它的作用域设置平台发布仅作门铃的变更通知
预览分享卡片长什么样 ↓joao-paulo-santos/dsh-event-relay
分享 · DeepSeek Harness Hub
joao-paulo-santos/dsh-event-relay

让宿主主动推送通知,插件界面实时响应变化

这是你的仓库?认领条目

回到顶部