dsh-programmer-chatroom
已验证@eave_bounty/dsh-programmer-chatroom · v1.2.2 · MIT · Web 界面
Decentralized P2P group chat for DeepSeek Harness (DSH): every machine is a relay server, text moderated offline by an embedded DFA sensitive-word filter, with a WeChat/QQ-style DeepSeek-branded UI.
安装
dsh plugin add @eave_bounty/dsh-programmer-chatroom 用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。
源码
标签
说明文档
dsh-programmer-chatroom
English · 简体中文
面向 DeepSeek Harness(
dsh)的去中心化 P2P 群聊插件。 每一台运行 DSH 的机器都自动成为一个中继服务器;程序员们在等待 Agent 生成的间隙互相聊天。 文本由每台节点本地离线的内嵌 DFA 敏感词过滤器审核,UI 采用微信/QQ 质感 + DeepSeek 官方蓝紫配色。
目录
概述
- 去中心化 mesh:每台 DSH 启动时自动拉起伴生中继
dshc-relay.js(绑定0.0.0.0),每台机器都是 真实服务器。节点间通过 HTTP 拉取合并、按全局msgId去重——没有中央服务器,任何在线机器都能中继。 - 内容监控:每台节点本地离线对每条消息做内嵌 DFA 敏感词过滤 + 中文词库。拦截的消息在发送端
静默丢弃——不记录、无监控页、发送者零体感(见
docs/SECURITY.md)。 - 微信/QQ 质感 UI:聊天气泡、彩色头像、Emoji 选择器、表情包、✨Enjoy、成员名单;面板固定为 DeepSeek 白蓝浅色,聊天页只显示消息(无节点干扰)。
- 成员身份:每台机器由硬件指纹派生稳定
deviceId,自动分配不同颜色头像 + 随机不撞名昵称, 可在设置页修改。 - 显示设置:设置页可调气泡间距 / 字距 / 字号,实时生效并记忆。
- 双网络模式:可切换 局域网(UDP 信标自动发现同网段节点并尝试直连)或 互联网(一键 cpolar 穿透
- 上报到你的 Cloudflare Workers 站点,跨 NAT 互聊)。
- 不持久化:聊天记录只存于在线机器的内存,全部关闭即消失。
为什么去中心化
DSH 插件宿主半区只暴露 ctx/harness/btoa/atob/TextEncoder/Decoder/console——没有
net/dgram/crypto/ws/URL,且部分部署会禁用 web.fetch。因此插件自身无法绑定对外接口或做出站 HTTP。
解决方式:插件用宿主 subprocess 服务拉起一个插件外的 Node 伴生中继进程(完整标准库)负责真正网络;
插件与中继之间用文件 IPC(共享文件系统)交换消息。这正是"每台机器都是服务器"能在 DSH 插件沙箱内实现的原因。
安装
这是一个标准 DSH 插件包,可从 npm 安装并在 DSH web profile 中加载。
从 npm 安装
# 安装到你的 DSH profile(推荐)
dsh plugin --profile web add @eave_bounty/dsh-programmer-chatroom
# 或全局安装 npm 包
npm install -g @eave_bounty/dsh-programmer-chatroom
安装后重启 DSH,插件自动加载,web profile 侧边栏底部会出现 💬 群聊 按钮。
从源码 / 本地路径
dsh plugin --profile web add <本仓库路径>
# 或
pnpm add file:<本仓库路径>
独立运行中继(局域网 peer / 调试 / NAT)
# 在 0.0.0.0 上运行伴生中继
node dshc-relay.js --port 39321 --bind 0.0.0.0 --name nodeA
# 可选 NAT 穿越(STUN + rendezvous + TURN)
node dshc-relay.js --port 39321 --bind 0.0.0.0 --stun stun.l.google.com:19302 --rendezvous http://your-rendezvous:8080 --turn turn.example.com:3478
测试 peer 客户端
node dshc-relay-test-peer.js Alice "hello everyone" "sk-should-be-blocked1234567890"
快速开始
- 在 DSH 会话加载插件,侧边栏底部出现 💬 群聊 按钮。
- 打开浮动面板——聊天页只显示消息;成员页看在线成员;设置页改昵称/头像颜色、调气泡间距/字距/字号。
- 局域网聊天(默认):同网段多台 DSH 会被自动发现并直连(UDP 信标),无需手填;也可在
设置→网络模式里手动添加
http://<对方机器IP>:<对方端口>。 - 互联网聊天(跨 NAT):
- 先在 设置 → 网络模式 切到「互联网」并填你的 Cloudflare Workers 站点地址(部署见 docs/RENDEZVOUS.md);
- 再到 内网穿透 一键启动 cpolar(
npm i -g cpolar,免费账号cpolar authtoken <token>),拿到公网地址; - 插件自动把公网地址上报到站点、拉回其它在线节点的公网地址并直连。
- 关闭群聊/插件时,隧道与上报自动停止,节点目录约 5 分钟过期消失。
P2P 如何实现
机器A 机器B
┌────────────────────────────┐ ┌────────────────────────────┐
│ DSH 插件 Host │ │ DSH 插件 Host │
│ room + DFA 审核 │ │ room + DFA 审核 │
└──────┬─────────────────────┘ └──────┬─────────────────────┘
│ 文件 IPC (outbox/state) │ 文件 IPC (outbox/state)
▼ ▼
┌────────────────────────────┐ ┌────────────────────────────┐
│ 伴生中继 0.0.0.0:P │◄──── HTTP 拉取 ───►│ 伴生中继 0.0.0.0:P │
│ mesh (按 msgId 去重) │ │ mesh (按 msgId 去重) │
└────────────────────────────┘ └────────────────────────────┘
- 同一局域网(局域网模式):每台中继在
0.0.0.0上监听,并周期广播 UDP 信标;发现同网段节点后 自动GET http://<对方IP>:<对方端口>/health确认并加入 mesh(无需手填)。已验证:中继/health返回 200。 - 跨公网 NAT(互联网模式):中继把本机 cpolar 公网地址上报到你的 Cloudflare Workers 站点,并拉取 其它在线节点的公网地址后直连。做法见 docs/RENDEZVOUS.md;插件随群聊自动停隧道并撤销上报。
内容监控
- DFA 敏感词词库(内嵌中文):政治敏感、毒品、赌博/诈骗/洗钱、色情、暴力/威胁/骚扰、 恶意软件/网络攻击、违法交易等。
- 正则增强:疑似 API 密钥/口令、疑似身份证号、疑似手机号。
- 拦截静默且端到端:违规消息在发送节点写入 mesh 之前即被丢弃(不写 outbox/中继/消息环),
任何节点都不会收到;不展示任何记录、发送者零反馈。见
docs/SECURITY.md。 - 词库在宿主
LEXICON数组,改后发新 Package 即可更新规则。
项目结构
dshc-relay.js # 伴生中继(完整 Node;0.0.0.0;HTTP mesh + UDP 信标 + 文件 IPC)
dshc-relay-test-peer.js # 局域网测试 peer 客户端
workers/rendezvous.js # Cloudflare Workers 公网站点(在线节点目录)
workers/wrangler.example.toml
docs/ARCHITECTURE.md # 架构与 IPC 协议
docs/SECURITY.md # 安全审计与加固报告
docs/RENDEZVOUS.md # 公网站点协议 + Workers 部署
CONTRIBUTING.md # 贡献指南
CHANGELOG.md # 更新日志
LICENSE # MIT
发布
- 更新
package.json版本号并追加CHANGELOG.md。 - 提交并 push 到
main。 - 打
vX.Y.Z标签并创建 GitHub Release。
License
MIT © EaveBounty。