packages/dsh-remote-web-ui
zhu1090093659/dsh-web手机/PC 远程操控 dsh web 工作区:扫码配对、令牌门控通道、SSE 实时同步,提供移动端与完整桌面 GUI 两种远程形态。
把飞书(Lark)自建机器人接到 DeepSeek Harness:手机上发一条飞书消息,DSH 里就开一轮;这一轮的回复自动回到飞书。走飞书自建应用的长连接,不需要公网 IP、不需要内网穿透、不需要回调地址。
零第三方依赖(只用 Node 内置模块),自己实现飞书长连接的帧编解码。
English: A zero-dependency bridge that connects a Feishu/Lark self-built bot to DeepSeek Harness over the official WebSocket long connection. Send a Feishu message → a DSH turn starts → the answer is posted back to the same chat. No public IP, no tunnel, no callback URL required.
DSH 跑在自己电脑上,人经常不在电脑前。这个插件让飞书成为本地 DSH 的输入输出口:
rpcId 精确配对,并发时也不会把 A 的回答回给 BbindingFile 里,只有一行,改完下一轮生效,不用重启source.kind / form:'notice',在对话界面里显示成上下文条目,而不是伪装成用户说的话dsh plugin --profile desktop add ./dsh-feishu-bridge或者在 DSH 桌面端的 设置 → 插件 里从目录安装。装完重启一次宿主(插件在宿主进程里起长连接)。
im:message(读取用户发给机器人的消息)im:message:send_as_bot(以机器人身份发消息)im:resource)im.message.receive_v1插件的配置走 profile 的 cordis.patch.yml,凭据单独放一个 JSON 文件(不放进插件配置,避免跟着插件一起被备份/导出):
- insert:
- id: dsh-feishu-bridge
name: 'dsh-feishu-bridge'
config:
configPath: 'C:\Users\you\.dsh\feishu-config.json'
bindingFile: 'C:\Users\you\.dsh\feishu-target-session.txt'
stateDir: 'C:\Users\you\.dsh\feishu-bridge'feishu-config.json:
{
"appId": "cli_xxx",
"appSecret": "xxx",
"allowOpenIds": ["ou_xxx"],
"allowChatIds": ["oc_xxx"],
"note": "allowOpenIds / allowChatIds 是白名单;留空 = 谁都不放行"
}bindingFile:只有一行,内容是要投递的目标会话 id(session-xxxx)。改一行、下一轮生效。sessionId,bindingFile 优先生效。appSecretRef + DSH 的凭证机制(ctx.credentials.resolve),配置文件里只留引用名。插件里带了一个「定时判定 + 概率累计 + 四选一」的主动行为模块:每隔一小时判定一次,掷骰子决定这次自由时间是「上网 / 翻文件 / 找你说话 / 什么都不发」,命中前每次落空累计 +N% 概率。
默认是关的。 打开需要再加一个策略文件(selftrigger-policy.json,enabled: true),并且想清楚一件事:它会让 AI 在你没说话的时候主动占用一次模型调用。不需要就别开。
这个插件在宿主里能碰到的范围,如实列出(市场审查口径):
能力 · 用途 network · 只连 open.feishu.cn(长连接 WSS + 发消息 / 取资源 HTTPS) fs-read · 读 configPath、bindingFile fs-write · 只写 stateDir 下的状态、日志、心跳 host-runtime · sessionController.resolveAgent + agent.followup 投递消息 credentials(可选) · 仅在配了 appSecretRef 时读一个具名凭证
不做的事:不开子进程、不执行 shell、不扫描磁盘、不读凭据文件、不上报任何遥测。
0.2.1-rc.2(desktop profile),Node ≥ 22ctx.sessionController(resolveAgent / prompt)、ctx.on('session/event')、ctx.credentials.resolvestateDir 下的日志再升级bindingFile 即可MIT