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

跨设备智能体通信 zfu691531-hash/dsh-a2a-messenger

DeepSeek Harness
zfu691531-hash77 天前有提交已提供中文文档扫描:含敏感能力

用加密信箱和直连让多台设备的智能体互相收发消息

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
装得上吗
曾在 dsh 0.2.0-rc.2 下真实安装成功,但当前 dsh 已更新至 0.2.1-rc.5,本站尚未在新版下复验
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 77 天前
档位由哪些信号合成

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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.
预览分享卡片长什么样 ↓zfu691531-hash/dsh-a2a-messenger
分享 · DeepSeek Harness Hub
zfu691531-hash/dsh-a2a-messenger

用加密信箱和直连让多台设备的智能体互相收发消息

回到顶部