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

A2A 双端互联 ryubyte/dsh-a2a

DeepSeek Harnessv0.3.1
ryubyte35 天前有提交已提供中文文档扫描:含敏感能力

一个 DeepSeek Harness DSH 插件,实现 Agent2Agent A2A 协议 v1.0Linux…

37.2/100
综合分
11
GitHub 星标
339
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @ryubyte/dsh-a2a
npm 源 · @ryubyte/dsh-a2a 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
数据截至 2026/11/01·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/03·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 35 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包@ryubyte/dsh-a2a @ 0.3.1
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 16:39:34

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 32 处,展示前 30 条)
  • 读取本地文件
    lib/index.js:1622
    if (existsSync(argvFile)) return argvFile;
  • 读取本地文件
    lib/index.js:1625
    if (existsSync(cwdFile)) return cwdFile;
  • 读取本地文件
    lib/index.js:1629
    if (existsSync(up)) return up;
  • 读取本地文件
    lib/index.js:1635
    if (base && existsSync(profileFile)) return profileFile;
  • 读取本地文件
    lib/index.js:1637
    if (existsSync(globalFile)) return globalFile;
  • 读取本地文件
    lib/index.js:1644
    if (!existsSync(path)) return {};
  • 写入本地文件
    lib/index.js:1659
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    lib/index.js:1661
    writeFileSync(tmp, JSON.stringify(config, null, 2) + "\n", "utf8");
  • 写入本地文件
    lib/index.js:1662
    renameSync(tmp, path);
  • 写入本地文件
    lib/index.js:2545
    mkdirSync(dir, { recursive: true });
  • 发起网络请求
    lib/client.js:320
    const res = await fetch("/a2a/api", { headers: { accept: "application/json" } });
  • 发起网络请求
    lib/client.js:325
    return await (await fetch("/a2a/api", {
  • 发起网络请求
    lib/client.js:408
    const sbody = await (await fetch("/a2a/api", {
  • 发起网络请求
    lib/client.js:446
    const body = await (await fetch("/a2a/api", {
  • 写入剪贴板
    lib/client.js:673
    await navigator.clipboard.writeText(props.text);
  • 读取本地文件
    src/a2a-config.ts:159
    if (existsSync(argvFile)) return argvFile;
  • 读取本地文件
    src/a2a-config.ts:164
    if (existsSync(cwdFile)) return cwdFile;
  • 读取本地文件
    src/a2a-config.ts:170
    if (existsSync(up)) return up;
  • 读取本地文件
    src/a2a-config.ts:178
    if (base && existsSync(profileFile)) return profileFile;
  • 读取本地文件
    src/a2a-config.ts:182
    if (existsSync(globalFile)) return globalFile;
  • 读取本地文件
    src/a2a-config.ts:205
    if (!existsSync(path)) return {};
  • 写入本地文件
    src/a2a-config.ts:221
    mkdirSync(dir, { recursive: true });
  • 写入本地文件
    src/a2a-config.ts:223
    writeFileSync(tmp, JSON.stringify(config, null, 2) + '\n', 'utf8');
  • 写入本地文件
    src/a2a-config.ts:225
    renameSync(tmp, path);
  • 发起网络请求
    src/client/index.ts:105
    const res = await fetch('/a2a/api', { headers: { accept: 'application/json' } });
  • 发起网络请求
    src/client/index.ts:111
    const res = await fetch('/a2a/api', {
  • 发起网络请求
    src/client/index.ts:257
    const sres = await fetch('/a2a/api', {
  • 发起网络请求
    src/client/index.ts:301
    const res = await fetch('/a2a/api', {
  • 写入剪贴板
    src/client/index.ts:788
    await navigator.clipboard.writeText(props.text);
  • 写入本地文件
    src/index.ts:1016
    mkdirSync(dir, { recursive: true });
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

2 张 · 点击查看大图

功能亮点

  • 发现远程Agent
  • 映射技能为工具
展开完整介绍(129 字)↓

DSH 的 A2A v1.0 双端插件:客户端发现远程智能体并映射为工具,服务端对外提供 JSON-RPC/SSE 端点与连接面板 | A2A v1.0 双端 DSH 插件:A2A 客户端(技能即工具)+ A2A 服务端(JSON-RPC/SSE),带面板。

v0.3.12026-09-30
· 变更 · 两个必需的主机侧 DSH 对等依赖同时允许 DSH 0.2.0-rc.1 和 0.1.7-rc.2。 · 基于锁定版本的 DSH 0.2.0-rc.1 开发包构建;客户端 UI 包只保留为开发期类型依赖。 · 在 docs/dsh-compat.md 中记录版本门槛、依赖决策和验证结果。 · 验证 · 冻结安装、类型检查、46 项测试、构建和客户端打包冒烟测试已在本地和 CI 通过。 · 尚未在 DSH 0.2.0-rc.1 主机上做真实安装验证。
v0.3.02026-09-28
兼容当前 DeepSeek Harness(dsh 0.1.7-rc.2),并新增入站 CORS 支持。 · 修复 · 会话格式 v4 下入站 A2A 任务失败(#7)。DSH 智能体执行器打上了已废弃的 v3 来源包装 { kind: 'plugin', plugin },v4 会拒绝这种写法。现在改为输出生产者自有的 { kind: 'plugin:a2a' }。⚠️ 修复前创建的会话仍保留旧结构,依旧不可用——请弃用它们。 · 「A2A 连接」设置面板消失(#5)。客户端用裸的 slots.register 注册设置区块,启动时与插槽声明竞争一旦抢先就会抛错(错误被静默吞掉)。现在改用 slots.inject 延迟注册,官方区块也是这么做的。 · 从已废弃的 @deepseek-ai/dsh-client-runtime 迁移:ClientContext 现在来自 @deepseek-ai/cordis,slots 扩展来自 dsh-client-ui-renderer。对等依赖升到 0.1.7-rc.2,cordis 升到 ^4.0.4。 · 功能 · 入站 A2A 端点支持 CORS(#8),浏览器端 A2A 客户端(Flutter Web、原生 fetch())可以跨源调用。 - 新增 server.corsOrigins——显式的来源白名单。默认空 = 不开 CORS(安全考虑:服务端鉴权可选且默认关闭,通配默认会把本地智能体暴露给任意站点)。匹配到的 Origin 会回显并带上 Vary: Origin;["*"] 可开启通配,但会给出警告。 - 可在「对外服务」设置面板编辑(增删来源);实时生效,持久化到 a2a.json。 - 修复一个潜在的 SSE 缺陷:响应头在 content-type: text/event-stream/CORS 设置之前就已刷出。 · npm 新增发现关键词。通过 Trusted Publishing 发布到 @ryubyte/dsh-a2a。
v0.2.12026-08-26
仅文档补丁,不改代码。 · 📝 文档 · 安装优先布局——安装和截图现在排在功能之前。 · 仅支持 npm 安装——删掉了从仓库安装(开发)的路径。 · 安装命令固定为 --profile web——dsh plugin --profile web add @ryubyte/dsh-a2a,提高安装成功率。 · 删掉了「编程调用」和「开发」两节;修正了 executor 说明里指向已删除编程调用节的悬空引用。 · README.md 和 README.en.md 同步更新。 · 破坏性变更 / 迁移 · 无破坏性变更。只改文档——插件、API 和 a2a.json 的行为与 v0.2.0 完全一致。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-a2a 一个 DeepSeek Harness (DSH) 插件,实现 Agent2Agent (A2A) 协议 v1.0(Linux 基金会,a2aproject/A2A,Apache-2.0)。 让一个 DSH 实例成为完整的 A2A 双端节点: - Client 模式(出站)——通过远程 Agent 的 AgentCard 发现它,把每个 skill 映射为 DSH 模型工具(a2a__<name>__<skill>),通过 A2A JSON-RPC 执行远程任务。 - Server 模式(入站)——把本 DSH 暴露给其他 Agent:在 DSH webserver 上提供 /.well-known/agent-card.json 与 JSON-RPC 端点(SendMessage、GetTask、ListTasks、CancelTask、基于 SSE 的 SendStreamingMessage)。 安装 一行命令装进 profile,重启即生效: dsh plugin --profile web add @ryubyte/dsh-a2a dsh --profile web dsh plugin 会把包装进 profile 并自动加入插件层(本包在 package.json 里声明了 dsh.bundle.patch),无需手动改任何配置。
展开完整文档(README 剩余 1 节)
dsh-a2a

一个 DeepSeek Harness (DSH) 插件,实现 Agent2Agent (A2A) 协议 v1.0(Linux 基金会,a2aproject/A2A,Apache-2.0)。

让一个 DSH 实例成为完整的 A2A 双端节点:

- Client 模式(出站)——通过远程 Agent 的 AgentCard 发现它,把每个 skill 映射为 DSH 模型工具(a2a__<name>__<skill>),通过 A2A JSON-RPC 执行远程任务。
- Server 模式(入站)——把本 DSH 暴露给其他 Agent:在 DSH webserver 上提供 /.well-known/agent-card.json 与 JSON-RPC 端点(SendMessage、GetTask、ListTasks、CancelTask、基于 SSE 的 SendStreamingMessage)。

安装

一行命令装进 profile,重启即生效:

dsh plugin --profile web add @ryubyte/dsh-a2a
dsh --profile web

dsh plugin 会把包装进 profile 并自动加入插件层(本包在 package.json 里声明了 dsh.bundle.patch),无需手动改任何配置。

截图

| 连接的 Agent(本 DSH 作为客户端) | 对外服务(本 DSH 作为 Agent) |
| 连接的 Agent 面板 | 对外服务面板 |

功能

协议能力(A2A v1.0)

- 发现:GET /.well-known/agent-card.json(优先 well-known,配置的 URL 兜底)
- 单次调用:SendMessage、GetTask、ListTasks、CancelTask、GetExtendedAgentCard
- 流式:SendStreamingMessage(SSE)/ SubscribeToTask,含 TaskStatusUpdateEvent + TaskArtifactUpdateEvent
- 任务生命周期:SUBMITTED → WORKING → COMPLETED / FAILED / CANCELED / REJECTED / INPUT_REQUIRED / AUTH_REQUIRED
- 鉴权:出站按 Agent 配置 Bearer Token(Authorization: Bearer …);入站可选共享 Bearer Token 保护端点——配置后 AgentCard 声明 bearerAuth 安全方案,未带/错误 token 的请求返回 401(单次调用与 SSE 流均生效)
- 类型:Task、Message、Part(text/raw/url/data)、Artifact、AgentCard、安全方案、扩展

连接面板(设置 → A2A 连接)

面板按角色分为两个 tab,全部配置都可在 UI 里完成,无需手改 a2a.json:

「连接的 Agent」(本 DSH 作为客户端,出站)

- 列出已连接的远程 Agent(名称、连接状态、AgentCard URL、技能/工具数、最近活动),展开可看每个 skill 的名称/标签/描述;每个 Agent 支持 重连 / 设置 / 禁用 / 删除(已禁用的 Agent 显示为灰化占位卡,操作按钮变为 启用)。
- 设置:就地编辑该 Agent 的 超时(timeoutMs)、技能拆分(mapSkills)、Bearer Token,保存后自动以新配置重连生效。
- 添加 Agent:填 AgentCard URL(可选 Bearer Token)→「导入」预览远端名称/描述/技能 →「连接」。配置写回 a2a.json。

「对外服务」(本 DSH 作为 Agent 对外,入站)

- 服务身份可视化编辑:只读展示服务名/描述/版本、端点、Agent Card URL(一键复制)与 Skills;点「编辑」就地改这些字段并完整增删改 Skills,保存即时重建 AgentCard 生效(无需重启)。
- 引导式初始化:全新安装(无 a2a.json)时,本页显示预填好合理默认值的表单,用户按需修改后点「创建并上线」即可发布服务——一步生成 a2a.json 并启动。
- 上线 / 下线 开关;显示 入站任务由谁执行(自定义 executor / 本 DSH agent 会话 / 未配置)。
- 入站鉴权:设置或清除保护入站端点的共享 Bearer Token(持久化到 a2a.json,实时生效)。
- 入站连接:谁在调用本 DSH(来源、地址、首/末次连接、任务数、流式标记),支持关闭。
- 面板每 3 秒自动刷新;/a2a/api 提供 JSON 快照与控制接口,受 loopback/same-origin 保护(token 值不会通过快照回传,只暴露「是否已配置」)。

运行时配置(a2a.json)

配置以 a2a.json(按 profile 存放,可完全通过 UI 管理)为准,无需改动组合配置即可管理 Agent 与对外服务。文件定位不依赖启动目录:插件解析进程命令行里的 --profile <name>(dsh web 别名同样识别为 web profile),读写 ~/.dsh/profiles/<name>/a2a.json——UI 首次生成的配置也会写到该 profile 目录,从任意工作目录启动都能读到。手写 a2a.json 仍然支持(见下文),但新用户完全靠 UI 即可完成配置与上线。

使用

1. 配置远程 Agent(出站)

在 profile 目录下的 a2a.json 里声明要连接的 Agent:

{
"agents": [
{
"name": "research",
"agentCardUrl": "https://research.example.com/.well-known/agent-card.json",
// "bearerToken": "...",
// "timeoutMs": 8000,
// "mapSkills": true,
// "enabled": false // 保留条目,但不自动连接 } ] }

也可以在 Web GUI「设置 → A2A 连接 →『连接的 Agent』→ 添加 Agent」里输入 AgentCard URL 导入并连接,配置会写回 a2a.json;连接后点该 Agent 的「设置」还能调整超时、技能拆分与 Token。

连接成功后,对方 Agent 的 skills 会作为模型工具出现:a2a__<name>__<skill>。

同一个本地 agent 会话对某远程 Agent 的多次工具调用会复用同一个 A2A contextId,因此在远端落到同一会话、具备跨轮记忆;不同本地会话相互隔离,各自独立对话。

2. 对外提供 A2A 服务(入站)

推荐:直接用 UI。 打开「设置 → A2A 连接 →『对外服务』」,全新安装会显示预填好的表单,改几个字段后点「创建并上线」即可——无需手写下面的 JSON。以下为等价的手写配置,供了解字段或脚本化部署时参考。

也可以在 a2a.json 里手动开启 server 模式:

{
"mode": "server",
"server": {
"enabled": true, // 显式开启入站服务 // "baseUrl": 省略即自动推导(见下),仅反向代理/公网域名时才需显式设置 "agentName": "My DSH Agent", "agentDescription": "A DSH agent over A2A v1.0", "agentVersion": "0.1.0",
"skills": [
{ "id": "coding", "name": "Coding", "description": "Execute coding and shell tasks.", "tags": ["coding", "shell"] }
]
}
}

baseUrl 留空(或在 UI 里清空)时,AgentCard 会按 webServer 的真实监听地址自动推导,不会公布过期端口;仅当本 DSH 位于反向代理或公网域名之后、对外地址与本地监听不同时,才需要显式填写。

关于 mode:mode(client / server / both)控制启动时挂载哪一半,缺省为 client。它是可选的——server.enabled: true 或存在 agents 就会分别启用对应半区,所以通过 UI 生成的 a2a.json 通常不写 mode,仅靠这些字段隐式推导行为。手写时显式写 mode 更直观,二者等价。

之后其他 A2A 客户端通过自动推导出的 http://<host>:<port>/.well-known/agent-card.json 发现本 DSH,通过 /a2a 端点调用。

入站任务由谁执行(executor 优先级)

server 模式收到任务后,按以下优先级选择 executor:

1. 显式 execute(通过 composition 配置注入)—— 用你的。
2. 本 DSH 的 agent 会话(默认,当 agent 循环就位时)—— 按 A2A contextId 一个对话一个会话:某 contextId 首个任务 ctx.agents.create() 建会话(后续同 contextId 复用同一会话,历史累积;进程重启后按需 resume),把消息作为 next-turn 唤醒项发给它,等 whenIdle(),取最新 assistant 回复作为 A2A artifact。同一 contextId 的并发任务按序串行,不同 contextId 并行。会话不逐任务释放(否则无法累积上下文),插件卸载/下线时统一释放。开 server 即可「接收并处理任务」,无需写代码。
3. notConfiguredExecutor(兜底)—— 既没注入 execute、composition 里又没有可用 agent 循环(如仅 dsh-base 的最小 profile)时,返回「no executor configured — inject one」,不执行任何命令。

关于「就位」:ctx.agents(registry)存在 ≠ 能创建 agent。create() 需要 agent-loop 插件注册的 factory;缺 factory 时 create() 会 reject,此时 DSH agent executor 会把它作为可读错误返回(而非抛出)。因此最小 profile 仍需显式注入 executor。

会话与工作区:DSH 会话在创建时把 cwd 校验为绝对路径并冻结进会话头。入站会话用专用目录 <profile>/.a2a-sessions 作为 cwd(与 profile 根分开,避免入站会话挤占你的交互会话)。它们出现在会话列表的「未分组」里,并按首条消息摘要命名为 A2A: <摘要>(入站消息带 plugin 来源,DSH 的自动标题只认 human 消息,故显式命名)。命名是装饰性的,失败只记日志、绝不影响任务。

取消:CancelTask 会 abort 正在运行任务的 executor 信号,真正中止 agent 回合(不只是改任务状态)。

本机自测也可显式传入 shellExecutor(把 prompt 当作 shell 命令执行,仅限可信客户端);生产请置于 TLS 反向代理之后并按需配 authToken。

目录结构

src/
protocol.ts # A2A v1.0 类型与常量 card.ts # AgentCard 发现 / 校验 jsonrpc.ts # JSON-RPC 2.0 + SSE 传输 client.ts # 出站客户端(A2AClient) server.ts # 入站服务 + TaskStore(A2AServer) outbound.ts # skill → 模型工具桥(registerAgentTools) dashboard.ts # 连接注册表 + 控制 a2a-config.ts # 运行时 a2a.json 解析 / 持久化 index.ts # Cordis 插件入口(client / server 两种模式) client/ index.ts # 浏览器半区:设置页「A2A 连接」面板 lib/ # 构建产物(index.js + client.js + types/) scripts/ build-client.mjs # 客户端 bundle 包装(__ModuleLoader__) capture-shots.mjs # README 截图抓取(headless Chrome + CDP) cordis.patch.yml # 插件注册行(bundle 自挂载,无需手动配置) package.json # dsh.bundle.patch + dsh.client 清单

工作原理

- 插件在 ctx.inject(...) / ctx.effect(...) 内读取 ctx.webServer 与 ctx.tools(原生 Cordis 模式,与 dsh-client-hmr 等 bundle 一致);缺少任一半的组合只会闲置该半区,不会崩溃。
- server 模式 baseUrl 可选:省略时 AgentCard 公布 webServer 的真实监听地址,临时端口不会发布过期 URL。绑定 127.0.0.1 时公布该回环地址;绑定 0.0.0.0 时自动推导本机 LAN 地址(供远程 Agent 可达),无法推导才退回 127.0.0.1。仅在反向代理前置时才需显式设置。
- 客户端模式的连接生命周期钩子(onReady / onDispose)上报到进程级共享注册表;多个实例(client + server)共用,/a2a/api 每个进程注册一次。
- 所有注册 fiber 作用域化:插件停止 / 更新时由 Cordis 自动清理。
- 禁用(enabled:false)的 Agent 显示为灰化占位卡,不自动连接,直到重新启用。

已知限制

- 面板 API(/a2a/api)只监听 loopback / same-origin,供运维可见性使用,不承载机密。
- 入站服务的执行策略见入站任务由谁执行:有 agent 循环时默认由本 DSH 会话执行(绑定工作目录 cwd),否则(且未注入 executor)拒绝执行并返回「no executor configured」。shellExecutor 仅限本地自测。无论哪种 executor,都切勿向不受信网络暴露 server 模式(默认无鉴权,除非配置 authToken)。
- A2A 规范要求生产 AgentInterface.url 使用 HTTPS;DSH webServer 默认仅绑 loopback,对外暴露前需自行加 TLS。
- Bearer token(出站按 Agent 配置的、入站保护端点的 authToken)均明文存于 a2a.json,请自行保证该文件权限。
预览分享卡片长什么样 ↓ryubyte/dsh-a2a
分享 · DeepSeek Harness Hub
ryubyte/dsh-a2a

一个 DeepSeek Harness DSH 插件,实现 Agent2Agent A2A 协议 v1.0Linux…

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部