用加密信箱和直连让多台设备的智能体互相收发消息
26.7/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/7 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add zfu691531-hash/dsh-a2a-messenger该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · tool
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 77 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 46 处,展示前 45 条)
- 读取密钥环境变量lib/index.js:89
const env = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN; - 执行外部命令固定命令lib/index.js:93
const fromCli = execSync('gh auth token', { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim(); - 读取本地文件lib/direct/identity.js:34
if (existsSync(filePath)) { - 读取本地文件lib/direct/identity.js:35
const parsed = parseStoredIdentity(readFileSync(filePath, 'utf8')); - 写入本地文件lib/direct/identity.js:45
mkdirSync(dirname(filePath), { recursive: true }); - 写入本地文件lib/direct/identity.js:55
writeFileSync(tmp, JSON.stringify(stored, null, 2), { encoding: 'utf8', mode: 0o600 }); - 写入本地文件lib/direct/identity.js:56
renameSync(tmp, filePath); - 读取本地文件lib/contacts.js:73
if (!existsSync(filePath)) - 读取本地文件lib/contacts.js:76
const raw = JSON.parse(readFileSync(filePath, 'utf8')); - 写入本地文件lib/contacts.js:183
mkdirSync(dirname(this.filePath), { recursive: true }); - 写入本地文件lib/contacts.js:185
writeFileSync(tmp, JSON.stringify({ version: 1, contacts: this.list() }, null, 2), 'utf8'); - 写入本地文件lib/contacts.js:186
renameSync(tmp, this.filePath); - 读取本地文件lib/mailbox-envelope.js:178
if (!file || !existsSync(file)) - 读取本地文件lib/mailbox-envelope.js:181
const raw = JSON.parse(readFileSync(file, 'utf8')); - 写入本地文件lib/mailbox-envelope.js:202
mkdirSync(dirname(file), { recursive: true }); - 写入本地文件lib/mailbox-envelope.js:204
writeFileSync(tmp, JSON.stringify({ version: 1, seen: Object.fromEntries(this.seen) }), 'utf8'); - 写入本地文件lib/mailbox-envelope.js:205
renameSync(tmp, file); - 读取本地文件lib/inbox.js:23
if (existsSync(filePath)) { - 读取本地文件lib/inbox.js:25
const raw = JSON.parse(readFileSync(filePath, 'utf8')); - 写入本地文件lib/inbox.js:106
mkdirSync(dirname(this.filePath), { recursive: true }); - 写入本地文件lib/inbox.js:109
writeFileSync(tmp, payload, 'utf8'); - 写入本地文件lib/inbox.js:110
renameSync(tmp, this.filePath); - 发起网络请求lib/teammcp-client.js:86
const raw = (await this.request('POST', '/api/send', input)); - 发起网络请求lib/teammcp-client.js:93
const raw = await this.request('GET', '/api/inbox'); - 发起网络请求lib/teammcp-client.js:108
await this.request('POST', '/api/inbox/ack', {}); - 发起网络请求lib/teammcp-client.js:111
const raw = await this.request('GET', '/api/agents'); - 发起网络请求lib/teammcp-client.js:137
const raw = await this.request('GET', '/api/channels'); - 发起网络请求lib/transports/github.js:69
const raw = (await this.request('POST', `/repos/${this.opts.repo}/issues/${issue}/comments`, { - 发起网络请求lib/transports/github.js:75
const raw = await this.request('GET', `/repos/${this.opts.repo}/collaborators?per_page=100`); - 发起网络请求lib/transports/github.js:111
const user = (await this.request('GET', '/user')); - 发起网络请求lib/transports/github.js:143
const raw = await this.request('GET', `/repos/${this.opts.repo}/issues/${issue}/comments?since=${since}&per_page=100`); - 发起网络请求lib/transports/github.js:186
const list = await this.request('GET', `/repos/${this.opts.repo}/issues?state=open&labels=${CHANNEL_LABEL}&per_page=100`); - 发起网络请求lib/transports/github.js:192
const created = (await this.request('POST', `/repos/${this.opts.repo}/issues`, { - 读取本地文件lib/transports/github.js:238
if (file && existsSync(file)) { - 读取本地文件lib/transports/github.js:240
const raw = JSON.parse(readFileSync(file, 'utf8')); - 写入本地文件lib/transports/github.js:256
mkdirSync(dirname(file), { recursive: true }); - 写入本地文件lib/transports/github.js:258
writeFileSync(tmp, JSON.stringify({ cursor: this.cursor }), 'utf8'); - 写入本地文件lib/transports/github.js:259
renameSync(tmp, file); - 写入本地文件lib/transports/filesystem.js:32
mkdirSync(this.messagesDir, { recursive: true }); - 写入本地文件lib/transports/filesystem.js:47
mkdirSync(this.messagesDir, { recursive: true }); - 写入本地文件lib/transports/filesystem.js:59
writeFileSync(tmpPath, JSON.stringify(message), { encoding: 'utf8', mode: 0o600 }); - 写入本地文件lib/transports/filesystem.js:60
renameSync(tmpPath, finalPath); - 写入本地文件lib/transports/filesystem.js:65
mkdirSync(this.messagesDir, { recursive: true }); - 读取本地文件lib/transports/filesystem.js:67
const files = readdirSync(this.messagesDir) - 读取本地文件lib/transports/filesystem.js:73
message = parseStored(JSON.parse(readFileSync(join(this.messagesDir, file), 'utf8')));
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 加密信箱收发消息
- 设备间直连通信
- 跨设备智能体协作
本地优先、加密的跨设备智能体消息与协作 MVP
README
由 DeepSeek 最新模型翻译生成DSH A2A Messenger
跨设备智能体通信与协作的 DeepSeek Harness (DSH) 插件。
它的目标是「不自建后端也能开箱通信」,而不是假装互联网通信完全没有第三方:
- GitHub 信箱借用私有仓库做异步存储;
- 文件目录信箱借用 Syncthing、OneDrive、NAS 或移动介质同步;
- WebRTC 业务数据尽量机器直连,但默认 stun 策略会联系公共 STUN;
- strict 策略不联系 STUN/TURN,但跨 NAT 成功率更低;
- relay 策略只在用户自己配置 TURN 后启用,项目不内置默认中转。
所有路线都明确显示,不会把直连或密文发送失败静默降级为 GitHub 明文。
展开完整文档(README 剩余 1 节)
DSH A2A Messenger 跨设备智能体通信与协作的 DeepSeek Harness (DSH) 插件。 它的目标是「不自建后端也能开箱通信」,而不是假装互联网通信完全没有第三方: - GitHub 信箱借用私有仓库做异步存储; - 文件目录信箱借用 Syncthing、OneDrive、NAS 或移动介质同步; - WebRTC 业务数据尽量机器直连,但默认 stun 策略会联系公共 STUN; - strict 策略不联系 STUN/TURN,但跨 NAT 成功率更低; - relay 策略只在用户自己配置 TURN 后启用,项目不内置默认中转。 所有路线都明确显示,不会把直连或密文发送失败静默降级为 GitHub 明文。 能力 - GitHub 或共享目录异步信箱,支持离线送达; - X25519 + HKDF-SHA256 + AES-256-GCM 端到端密封信封,Ed25519 签名认证; - 人与设备分离的联系人:name@device、TOFU、人工核验、撤销; - GitHub/目录信箱自动传递加密的签名 A2A2 SDP,/a2a-call 免复制连接码; - WebRTC strict | stun | relay 三种 ICE 策略及 /a2a-doctor 候选诊断; - 多传输同时运行、显式 route、禁止自动 fallback; - 直连消息 sent → quarantined → accepted/rejected 回执; - 所有普通入站消息先进入本地隔离箱,只有用户批准后才对模型可见。 快速开始:GitHub 密封信箱 + 自动直连 前提:DSH、Node.js >= 22、一个仅通信成员可访问的 GitHub 私有仓库。 dsh plugin --profile web add github:zfu691531-hash/dsh-a2a-messenger - id: a2a-messenger config: agentName: 'alice' deviceName: 'work-laptop' transport: 'github' githubRepo: 'myteam/a2a-inbox' mailboxEncryption: 'sealed' mailboxTtlHours: 168 directIcePolicy: 'stun' githubToken 可省略:依次尝试 GITHUB_TOKEN、GH_TOKEN、gh auth token 双方各运行 /a2a-pair,通过已有可信渠道交换 A2AC1-... 配对卡: /a2a-pair-accept <对方的 A2AC1 卡> /a2a-verify bob@home-pc <对方指纹末 12 位> /a2a-call bob@home-pc 配对卡经过签名,但首次收到的身份仍是 TOFU;应通过当面、语音或另一个已认证渠道比对完整指纹。旧版 trustedPeers 继续有效,可逐步迁移,不会旋转原 Ed25519 身份。 共享目录信箱 适用于 Syncthing、OneDrive、Dropbox、NAS 共享目录或 U 盘。写入采用临时文件后原子重命名;建议始终使用 sealed。 - id: a2a-messenger config: agentName: 'alice' deviceName: 'desktop' transport: 'filesystem' filesystemDir: 'D:\Shared\dsh-mailbox' mailboxEncryption: 'sealed' 同步服务仍能看到文件名、时间、大小等元数据,但看不到密封后的正文。 多传输与路由 配置 GitHub 为主传输时,再设置 filesystemDir 会同时启动两条路线: transport: 'github' githubRepo: 'myteam/a2a-inbox' filesystemDir: 'D:\Shared\dsh-mailbox' mailboxRoute: 'github' mailboxEncryption: 'sealed' a2a_send 可传 route: github 或 route: filesystem。未指定时只走 mailboxRoute;所选路线失败就明确报错,不会换成安全性更低的路线。 直连策略 | 策略 | 外部服务 | 典型候选 | 特性 | | strict | 无 STUN/TURN | host | 同网、已有公网地址或端口映射;最少第三方,成功率最低 | | stun(默认) | 配置的 STUN | host、srflx | 业务数据仍点对点;STUN 可看到源 IP 和请求时间 | | relay | 用户配置的 TURN | relay | 最容易穿过严格 NAT;业务流量经过 TURN | TURN 示例: directIcePolicy: 'relay' turnServers: ['turns:turn.example.com:5349'] turnUsername: 'alice' turnCredential: '从密钥管理注入,不要提交仓库' 手工 /a2a-connect + /a2a-join 仍然保留,适用于没有密封信箱或希望经线下渠道携带 SDP 的场景。连接码包含网络候选,签名只能防篡改,不能隐藏它;自动信令会把连接码放进端到端密封信封。 命令与工具 模型工具: | 工具 | 作用 | | a2a_send | 通过异步信箱发送,可指定 route | | a2a_direct_send | 通过已连接的 WebRTC 会话发送 | | a2a_peers | 查看队友、频道和直连状态 | | a2a_inbox_status | 只查看隔离箱元数据,不泄露正文给模型 | 用户命令: | 命令 | 作用 | | /a2a-pair | 生成本设备签名配对卡 | | /a2a-pair-accept <卡> | 保存联系人为 TOFU | | /a2a-verify <name@device> <指纹后缀> | 核验联系人 | | /a2a-contacts | 查看人、设备、指纹和信任状态 | | /a2a-untrust <name@device> | 撤销设备 | | /a2a-call <name@device> [route] | 通过密封信箱自动建立直连 | | /a2a-doctor | 诊断 ICE 策略、候选、协议和第三方接触 | | /a2a-receipts | 查看直连投递状态 | | /a2a-status | 查看身份、路由、安全模式和连接状态 | | /a2a-inbox | 人工预览隔离消息 | | /a2a-accept <id\|all> | 放行并注入模型上下文 | | /a2a-reject <id\|all> | 拒绝消息 | | /a2a-connect、/a2a-join | 手工连接码流程 | | /a2a-disconnect | 关闭直连 | 安全边界 - 密封模式拒绝可读明文,不做静默降级;可读模式用于兼容旧部署。 - 密封信封使用静态设备 X25519 身份,没有双棘轮的前向保密;设备私钥泄露时应立即撤销并重新配对。 - GitHub、同步服务、STUN/TURN 和网络观察者仍可观察各自路径上的元数据。 - 联系人撤销是本地决定,不是全球证书吊销服务;其他设备也需分别撤销。 - 远端文本永远是外部输入。即使来源已认证,也必须经过隔离箱人工放行。 - 自动信令只消费已配对设备发来的、签名有效、未重放且 10 分钟内有效的密封 A2A2 连接码;普通密封消息默认保留 168 小时。 更详细的网络验证矩阵见 docs/CONNECTIVITY.md,信任模型见 docs/DIRECT-TRUST.md。 开发与验证 npm ci npm test 自动化覆盖身份迁移、配对与撤销、密封信封篡改、密文目录信箱、禁止路由降级、GitHub 首次并发建信箱竞态、自动加密信令、真实 WebRTC 回环和投递回执。真实跨地区、运营商 NAT 与防火墙组合仍需按验证矩阵在两台物理设备上执行。 License MIT. See LICENSE.
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
zfu691531-hash/dsh-a2a-messenger
用加密信箱和直连让多台设备的智能体互相收发消息
相关插件 · 工具 / 效率
破甲管控台kingcharleslzy-ai/dsh-purge
dsh-purge Community · DeepSeek Harness 社区维护版:宿主兼容、状态诊断、提示词管理、更新与本机备份回滚。基于小杨 / YuJunZhiXue 的 dsh-purge。
★ 4,173已汉化DeepSeek 客户端
74.4
网文长卷lingfengQAQ/webnovel-writer
基于 Claude Code 的长篇网文辅助创作系统,解决 AI 写作中的「遗忘」和「幻觉」问题,支持 200…
★ 7,636已汉化DSH
72.2
多智能体协作HKUDS/AutoSwarm
AutoSwarm: Unify Your Agents. Unify Your Context (Codex · Claude Code · DeepSeek Harness · Muse · Grok · WorkBuddy· nanobot · and more)
★ 2,349已汉化DSH
71.6
Vox 拼贴视频生成Alisa0808/vox-director
🎬 Vox Director拼贴动效导演
★ 2,129已汉化DSH
71.4
Agent 演化引擎Q00/ouroboros
智能体 OS:智能体自己变聪明,我们只守住底线:面试准入、分阶段评估、带预算的进化循环。MCP 服务器,14 种运行时:Claude Code、Codex CLI、Gemini CLI、OpenCode、Copilot、Kiro 等。
★ 6,308已汉化DSH
71.3
智能体运行框架路由HarnessRouter/harnessrouter
智能体运行框架的统一接口。
★ 3,897已汉化DSH
71.2