@wings006/agent-link 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -222
- package/dist/a2a-server.d.ts +2 -0
- package/dist/a2a-server.js +73 -4
- package/dist/a2a-server.js.map +1 -1
- package/dist/config.js +28 -3
- package/dist/config.js.map +1 -1
- package/dist/daemon-api.js +327 -4
- package/dist/daemon-api.js.map +1 -1
- package/dist/daemon.js +61 -10
- package/dist/daemon.js.map +1 -1
- package/dist/discovery.d.ts +10 -1
- package/dist/discovery.js +63 -19
- package/dist/discovery.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/local-discovery.d.ts +19 -0
- package/dist/local-discovery.js +133 -0
- package/dist/local-discovery.js.map +1 -0
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +408 -8
- package/dist/mcp-server.js.map +1 -1
- package/dist/relay-client.d.ts +2 -1
- package/dist/relay-client.js +14 -10
- package/dist/relay-client.js.map +1 -1
- package/dist/relay-server.js +13 -0
- package/dist/relay-server.js.map +1 -1
- package/dist/task-store.d.ts +115 -0
- package/dist/task-store.js +260 -0
- package/dist/task-store.js.map +1 -1
- package/dist/types.d.ts +6 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,16 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
多 Agent 聊天系统 — 连接多台电脑上的 Claude Code,实现 Agent 间互相通信。支持局域网自动发现和跨网络中继通信。
|
|
4
4
|
|
|
5
|
-
## 工作原理
|
|
6
|
-
|
|
7
|
-
每台电脑运行一个 `agent-link` 进程,同时承担:
|
|
8
|
-
|
|
9
|
-
- **MCP Server** — 给本地 Claude Code 提供 `agent_list`、`agent_send`、`agent_inbox`、`agent_reply`、`agent_mark_read`、`agent_clear_inbox`、`agent_task_status` 工具
|
|
10
|
-
- **A2A Server** — 接收其他电脑 Agent 发来的任务(HTTP JSON-RPC)
|
|
11
|
-
- **A2A Client** — 向其他电脑的 Agent 发送任务
|
|
12
|
-
- **mDNS 广播** — 零配置自动发现局域网内所有 Agent
|
|
13
|
-
- **中继客户端** — 通过公网中继服务器发现和通信跨网络 Agent
|
|
14
|
-
|
|
15
5
|
```
|
|
16
6
|
局域网 远程
|
|
17
7
|
电脑A (dev-macbook) 电脑B (office-pc) 电脑C (home-pc)
|
|
@@ -29,7 +19,9 @@
|
|
|
29
19
|
|
|
30
20
|
## 快速开始
|
|
31
21
|
|
|
32
|
-
|
|
22
|
+
在 Claude Code 的 MCP 配置中添加:
|
|
23
|
+
|
|
24
|
+
**局域网模式(同一网络内自动发现):**
|
|
33
25
|
|
|
34
26
|
```json
|
|
35
27
|
{
|
|
@@ -42,280 +34,145 @@
|
|
|
42
34
|
}
|
|
43
35
|
```
|
|
44
36
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
> 需要跨网络通信?添加 `"--relay", "ws://你的中继服务器:3458"`,详见[跨网络通信](#跨网络通信中继模式)。
|
|
48
|
-
|
|
49
|
-
## 从源码安装(可选)
|
|
50
|
-
|
|
51
|
-
如果需要开发或自定义:
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
git clone <repo-url> agent-link
|
|
55
|
-
cd agent-link
|
|
56
|
-
npm install
|
|
57
|
-
npm run build
|
|
58
|
-
npm link
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
执行 `npm link` 后,`agent-link` 命令全局可用,MCP 配置可改为:
|
|
37
|
+
**中继模式(跨网络通信):**
|
|
62
38
|
|
|
63
39
|
```json
|
|
64
40
|
{
|
|
65
41
|
"mcpServers": {
|
|
66
42
|
"agent-link": {
|
|
67
|
-
"command": "
|
|
68
|
-
"args": ["--name", "你的Agent名称"]
|
|
43
|
+
"command": "npx",
|
|
44
|
+
"args": ["-y", "@wings006/agent-link", "--name", "你的Agent名称", "--relay", "ws://中继服务器IP:3458"]
|
|
69
45
|
}
|
|
70
46
|
}
|
|
71
47
|
}
|
|
72
48
|
```
|
|
73
49
|
|
|
74
|
-
|
|
50
|
+
重启 Claude Code 即可。每台电脑使用不同的 `--name`。
|
|
51
|
+
|
|
52
|
+
## 参数说明
|
|
75
53
|
|
|
76
54
|
| 参数 | 简写 | 说明 | 默认值 |
|
|
77
55
|
|------|------|------|--------|
|
|
78
56
|
| `--name` | `-n` | Agent 名称(全局唯一) | 随机生成 |
|
|
79
57
|
| `--port` | `-p` | A2A Server 监听端口 | 3456 |
|
|
58
|
+
| `--api-port` | | 内部 API 端口 | 3457 |
|
|
80
59
|
| `--relay` | `-r` | 中继服务器地址(跨网络通信) | 无 |
|
|
81
|
-
| `--no-
|
|
60
|
+
| `--no-local` | | 禁用本机发现 | false |
|
|
61
|
+
| `--no-mdns` | | 禁用局域网发现 | false |
|
|
62
|
+
| `--no-relay` | | 禁用中继连接 | false |
|
|
82
63
|
| `--skills` | `-s` | 能力标签,逗号分隔 | general |
|
|
83
64
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
**电脑 A(开发机,局域网):**
|
|
65
|
+
也支持配置文件 `~/.agent-link/config.json`:
|
|
87
66
|
```json
|
|
88
67
|
{
|
|
89
|
-
"
|
|
90
|
-
|
|
91
|
-
"command": "npx",
|
|
92
|
-
"args": ["-y", "@wings006/agent-link", "--name", "dev-macbook", "--skills", "code,test"]
|
|
93
|
-
}
|
|
94
|
-
}
|
|
68
|
+
"name": "my-agent",
|
|
69
|
+
"relayUrl": "ws://8.134.178.228:3458"
|
|
95
70
|
}
|
|
96
71
|
```
|
|
97
72
|
|
|
98
|
-
|
|
99
|
-
```json
|
|
100
|
-
{
|
|
101
|
-
"mcpServers": {
|
|
102
|
-
"agent-link": {
|
|
103
|
-
"command": "npx",
|
|
104
|
-
"args": ["-y", "@wings006/agent-link", "--name", "office-pc", "--relay", "ws://your-server:3458", "--skills", "report,doc"]
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
```
|
|
73
|
+
环境变量 `AGENT_LINK_RELAY_URL` 也可设置中继地址。
|
|
109
74
|
|
|
110
75
|
## 使用
|
|
111
76
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
### 查看在线 Agent
|
|
115
|
-
|
|
116
|
-
```
|
|
117
|
-
你: 有哪些 agent 在线?
|
|
118
|
-
Claude Code → 调用 agent_list
|
|
119
|
-
Claude Code: 当前在线 Agent:
|
|
120
|
-
- dev-macbook (192.168.1.50:3456) [code, test]
|
|
121
|
-
- office-pc (192.168.1.100:3456) [report, doc]
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### 发送任务
|
|
125
|
-
|
|
126
|
-
```
|
|
127
|
-
你: 告诉 office-pc 帮我生成本周周报
|
|
128
|
-
Claude Code → 调用 agent_send(to: "office-pc", message: "帮我生成本周周报")
|
|
129
|
-
Claude Code: 任务已发送,等待 office-pc 处理...
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
对方电脑的 Claude Code 会收到消息,询问用户是否执行。
|
|
133
|
-
|
|
134
|
-
### 查看收件箱
|
|
135
|
-
|
|
136
|
-
```
|
|
137
|
-
你: 看看有没有人给我发消息
|
|
138
|
-
Claude Code → 调用 agent_inbox
|
|
139
|
-
Claude Code: 收到 1 条消息:
|
|
140
|
-
- 来自 dev-macbook: "帮我检查一下测试覆盖率" (待处理)
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### 回复任务
|
|
77
|
+
配置完成后直接用自然语言和 Claude Code 对话:
|
|
144
78
|
|
|
145
|
-
|
|
146
|
-
你: 回复这个任务,告诉他测试覆盖率是 85%
|
|
147
|
-
Claude Code → 调用 agent_reply(task_id: "xxx", message: "测试覆盖率 85%", status: "completed")
|
|
148
|
-
Claude Code: 已回复 dev-macbook
|
|
149
|
-
```
|
|
79
|
+
### 消息通信
|
|
150
80
|
|
|
151
|
-
|
|
81
|
+
- **"有哪些 agent 在线?"** → 调用 `agent_list`
|
|
82
|
+
- **"告诉 office-pc 帮我生成周报"** → 调用 `agent_send`
|
|
83
|
+
- **"看看有没有人给我发消息"** → 调用 `agent_inbox`
|
|
84
|
+
- **"回复这个任务"** → 调用 `agent_reply`
|
|
85
|
+
- **"标记全部已读"** → 调用 `agent_mark_read`
|
|
86
|
+
- **"清理已读消息"** → 调用 `agent_clear_inbox`
|
|
152
87
|
|
|
153
|
-
|
|
88
|
+
### 好友系统
|
|
154
89
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
6. B 的 Claude Code 询问 B 用户: "收到 dev-macbook 的请求,是否执行?"
|
|
162
|
-
7. B 用户确认 → B Claude Code 执行任务
|
|
163
|
-
8. B Claude Code 调用 agent_reply 回复结果
|
|
164
|
-
9. A Claude Code 收到结果,展示给 A 用户
|
|
165
|
-
```
|
|
90
|
+
- **"添加 office-pc 为好友"** → 调用 `agent_friend_request`
|
|
91
|
+
- **"查看好友请求"** → 调用 `agent_friend_requests`
|
|
92
|
+
- **"接受好友请求"** → 调用 `agent_friend_respond`
|
|
93
|
+
- **"查看好友列表"** → 调用 `agent_friends`
|
|
94
|
+
- **"删除好友"** → 调用 `agent_friend_remove`
|
|
95
|
+
- **"设置好友分组"** → 调用 `agent_friend_category`
|
|
166
96
|
|
|
167
|
-
|
|
97
|
+
### 群组功能
|
|
168
98
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
99
|
+
- **"创建一个群组"** → 调用 `agent_group_create`
|
|
100
|
+
- **"查看我的群组"** → 调用 `agent_group_list`
|
|
101
|
+
- **"邀请某人加入群组"** → 调用 `agent_group_invite`
|
|
102
|
+
- **"查看群组邀请"** → 调用 `agent_group_invites`
|
|
103
|
+
- **"接受/拒绝群组邀请"** → 调用 `agent_group_invite_respond`
|
|
104
|
+
- **"在群里发消息"** → 调用 `agent_group_message`
|
|
105
|
+
- **"查看群消息"** → 调用 `agent_group_messages`
|
|
106
|
+
- **"标记群消息已读"** → 调用 `agent_group_mark_read`
|
|
107
|
+
- **"离开群组"** → 调用 `agent_group_leave`
|
|
178
108
|
|
|
179
|
-
|
|
109
|
+
### 其他
|
|
180
110
|
|
|
181
|
-
|
|
111
|
+
- **"设置状态为忙碌"** → 调用 `agent_set_status`
|
|
112
|
+
- **"静音某人"** → 调用 `agent_mute`
|
|
113
|
+
- **"取消静音"** → 调用 `agent_unmute`
|
|
182
114
|
|
|
183
|
-
|
|
115
|
+
## 部署中继服务器
|
|
184
116
|
|
|
185
|
-
|
|
117
|
+
跨网络通信需要一台公网服务器作为中继:
|
|
186
118
|
|
|
187
119
|
```bash
|
|
188
|
-
# 创建目录
|
|
189
120
|
mkdir -p /opt/agent-link-relay && cd /opt/agent-link-relay
|
|
190
|
-
|
|
191
|
-
# 复制中继服务器文件
|
|
192
|
-
scp dist/relay-server.js user@server:/opt/agent-link-relay/
|
|
193
|
-
|
|
194
|
-
# 安装依赖
|
|
195
121
|
npm init -y
|
|
196
122
|
sed -i 's/"type": "commonjs"/"type": "module"/' package.json
|
|
197
123
|
npm install ws
|
|
198
124
|
|
|
125
|
+
# 从项目中复制中继服务器
|
|
126
|
+
scp dist/relay-server.js user@server:/opt/agent-link-relay/
|
|
127
|
+
|
|
199
128
|
# 启动
|
|
200
129
|
node relay-server.js --port 3458
|
|
201
130
|
```
|
|
202
131
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
```ini
|
|
206
|
-
# /etc/systemd/system/agent-link-relay.service
|
|
207
|
-
[Unit]
|
|
208
|
-
Description=Agent Link Relay Server
|
|
209
|
-
After=network.target
|
|
210
|
-
|
|
211
|
-
[Service]
|
|
212
|
-
Type=simple
|
|
213
|
-
WorkingDirectory=/opt/agent-link-relay
|
|
214
|
-
ExecStart=/usr/bin/node relay-server.js --port 3458
|
|
215
|
-
Restart=always
|
|
216
|
-
RestartSec=5
|
|
217
|
-
|
|
218
|
-
[Install]
|
|
219
|
-
WantedBy=multi-user.target
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
```bash
|
|
223
|
-
systemctl enable agent-link-relay && systemctl start agent-link-relay
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
> 注意:需要在云服务商安全组中放行 3458 端口(TCP 入方向)。
|
|
227
|
-
|
|
228
|
-
### 配置 Agent 连接中继
|
|
229
|
-
|
|
230
|
-
在 MCP 配置中添加 `--relay` 参数:
|
|
231
|
-
|
|
232
|
-
```json
|
|
233
|
-
{
|
|
234
|
-
"mcpServers": {
|
|
235
|
-
"agent-link": {
|
|
236
|
-
"command": "agent-link",
|
|
237
|
-
"args": ["--name", "my-agent", "--relay", "ws://your-server-ip:3458"]
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
```
|
|
132
|
+
> 需要在云服务商安全组中放行 3458 端口(TCP 入方向)。
|
|
242
133
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
```
|
|
246
|
-
电脑A (家里) 公网中继服务器 电脑B (公司)
|
|
247
|
-
┌───────────┐ WebSocket ┌──────────────┐ WebSocket ┌───────────┐
|
|
248
|
-
│ agent-link├──────────────►│ relay-server │◄──────────────┤agent-link │
|
|
249
|
-
└───────────┘ └──────────────┘ └───────────┘
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
- 双方通过 WebSocket 长连接到中继服务器
|
|
253
|
-
- 中继服务器维护在线 Agent 列表,推送给所有客户端
|
|
254
|
-
- 消息通过中继转发,中继不存储数据
|
|
255
|
-
- 局域网 mDNS 发现照常工作,同网络内优先直连
|
|
256
|
-
|
|
257
|
-
## 本机测试
|
|
134
|
+
## 故障排查
|
|
258
135
|
|
|
259
|
-
|
|
136
|
+
| 问题 | 解决方法 |
|
|
137
|
+
|------|---------|
|
|
138
|
+
| `agent_list` 看不到对方 | 确认双方在同一局域网,或都配置了相同的 `--relay` |
|
|
139
|
+
| 发送消息失败 `fetch failed` | 检查是否有代理拦截,`.local` 域名需加入 `no_proxy` |
|
|
140
|
+
| daemon 参数不生效 | 完全退出 Claude Code 重新打开(不只是 `/mcp`) |
|
|
141
|
+
| 中继连接失败 | 确认中继服务器端口已放行,`ws://IP:端口` 格式正确 |
|
|
142
|
+
| mDNS 发现不到 | macOS 检查防火墙;确认同一子网;路由器启用多播转发 |
|
|
143
|
+
| 同机多实例冲突 | 不同实例使用不同的 `--port` 和 `--api-port` |
|
|
260
144
|
|
|
261
|
-
|
|
262
|
-
```bash
|
|
263
|
-
agent-link --name agent-a --port 3456
|
|
264
|
-
```
|
|
145
|
+
## 三种发现模式
|
|
265
146
|
|
|
266
|
-
|
|
267
|
-
```bash
|
|
268
|
-
agent-link --name agent-b --port 3457
|
|
269
|
-
```
|
|
147
|
+
Agent Link 支持三种 Agent 发现方式,可组合使用:
|
|
270
148
|
|
|
271
|
-
|
|
149
|
+
| 模式 | 适用场景 | 原理 |
|
|
150
|
+
|------|---------|------|
|
|
151
|
+
| **本机发现** | 同一台电脑多实例 | 通过 `~/.agent-link/agents/` 目录下的 JSON 文件互相发现 |
|
|
152
|
+
| **mDNS 局域网发现** | 同一局域网 | 通过 mDNS/DNS-SD (`_agent-link._tcp`) 广播和发现 |
|
|
153
|
+
| **中继服务器** | 跨网络 | 通过公网 WebSocket 中继服务器转发消息 |
|
|
272
154
|
|
|
273
|
-
##
|
|
155
|
+
## 技术架构
|
|
274
156
|
|
|
275
|
-
|
|
157
|
+
每台电脑上的 agent-link 采用 **Daemon + MCP** 双进程架构:
|
|
276
158
|
|
|
277
|
-
|
|
159
|
+
- **Daemon 进程**:后台常驻,负责 A2A 通信、Agent 发现、消息存储(SQLite)、SSE 事件推送。MCP 断开后继续运行以保持在线
|
|
160
|
+
- **MCP 进程**:随 Claude Code 启动,通过 HTTP API 与 Daemon 通信,提供 MCP 工具
|
|
278
161
|
|
|
279
|
-
**电脑 A:**
|
|
280
|
-
```bash
|
|
281
|
-
npx tsx tests/mdns-debug.ts pc-a
|
|
282
162
|
```
|
|
283
|
-
|
|
284
|
-
**电脑 B:**
|
|
285
|
-
```bash
|
|
286
|
-
npx tsx tests/mdns-debug.ts pc-b
|
|
163
|
+
Claude Code ←→ MCP Server (stdio) ←→ Daemon API (HTTP) ←→ A2A / Relay / mDNS
|
|
287
164
|
```
|
|
288
165
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
如果发现不了对方,常见原因:
|
|
292
|
-
|
|
293
|
-
| 原因 | 排查方法 |
|
|
294
|
-
|------|---------|
|
|
295
|
-
| macOS 防火墙阻止 UDP 5353 | 系统设置 → 网络 → 防火墙,关闭或添加例外 |
|
|
296
|
-
| 两台电脑不在同一子网 | 确认 IP 在同一网段(如都是 192.168.1.x) |
|
|
297
|
-
| 路由器禁用多播转发 | 检查路由器设置,启用 mDNS/Bonjour 转发 |
|
|
298
|
-
| 企业网络隔离 | 部分企业 WiFi 会隔离客户端间通信 |
|
|
299
|
-
|
|
300
|
-
## 开发
|
|
166
|
+
## 从源码开发
|
|
301
167
|
|
|
302
168
|
```bash
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
npm
|
|
306
|
-
npm run
|
|
169
|
+
git clone https://github.com/l3wingsgg/agent_link.git
|
|
170
|
+
cd agent_link
|
|
171
|
+
npm install
|
|
172
|
+
npm run build
|
|
173
|
+
npm test # 134 个测试
|
|
307
174
|
```
|
|
308
175
|
|
|
309
|
-
## 技术栈
|
|
310
|
-
|
|
311
|
-
- TypeScript + Node.js
|
|
312
|
-
- [A2A 协议](https://github.com/a2aproject/A2A) — Agent 间通信(JSON-RPC over HTTP)
|
|
313
|
-
- [MCP 协议](https://modelcontextprotocol.io/) — Claude Code 工具集成
|
|
314
|
-
- [bonjour-service](https://www.npmjs.com/package/bonjour-service) — mDNS 零配置局域网发现
|
|
315
|
-
- [ws](https://www.npmjs.com/package/ws) — WebSocket 中继通信
|
|
316
|
-
- [better-sqlite3](https://www.npmjs.com/package/better-sqlite3) — SQLite 持久化存储
|
|
317
|
-
- [Vitest](https://vitest.dev/) — 测试框架
|
|
318
|
-
|
|
319
176
|
## 许可证
|
|
320
177
|
|
|
321
178
|
MIT
|
package/dist/a2a-server.d.ts
CHANGED
|
@@ -6,11 +6,13 @@ export declare class A2AServer {
|
|
|
6
6
|
private taskStore;
|
|
7
7
|
private onTaskReceived?;
|
|
8
8
|
private onTaskNotified?;
|
|
9
|
+
private getPresence?;
|
|
9
10
|
constructor(config: AgentLinkConfig, taskStore: TaskStore);
|
|
10
11
|
setOnTaskReceived(handler: (task: Task) => void): void;
|
|
11
12
|
setOnTaskNotified(handler: (task: Partial<Task> & {
|
|
12
13
|
id: string;
|
|
13
14
|
}) => void): void;
|
|
15
|
+
setGetPresence(handler: () => string): void;
|
|
14
16
|
start(): Promise<number>;
|
|
15
17
|
stop(): Promise<void>;
|
|
16
18
|
private getAgentCard;
|
package/dist/a2a-server.js
CHANGED
|
@@ -5,6 +5,7 @@ export class A2AServer {
|
|
|
5
5
|
taskStore;
|
|
6
6
|
onTaskReceived;
|
|
7
7
|
onTaskNotified;
|
|
8
|
+
getPresence;
|
|
8
9
|
constructor(config, taskStore) {
|
|
9
10
|
this.config = config;
|
|
10
11
|
this.taskStore = taskStore;
|
|
@@ -16,6 +17,9 @@ export class A2AServer {
|
|
|
16
17
|
setOnTaskNotified(handler) {
|
|
17
18
|
this.onTaskNotified = handler;
|
|
18
19
|
}
|
|
20
|
+
setGetPresence(handler) {
|
|
21
|
+
this.getPresence = handler;
|
|
22
|
+
}
|
|
19
23
|
// 尝试监听指定端口,被占用则自动分配随机端口
|
|
20
24
|
start() {
|
|
21
25
|
return new Promise((resolve, reject) => {
|
|
@@ -102,6 +106,14 @@ export class A2AServer {
|
|
|
102
106
|
handleRpc(req) {
|
|
103
107
|
switch (req.method) {
|
|
104
108
|
case "message/send": {
|
|
109
|
+
// offline 时拒绝消息
|
|
110
|
+
if (this.getPresence?.() === "offline") {
|
|
111
|
+
return {
|
|
112
|
+
jsonrpc: "2.0",
|
|
113
|
+
id: req.id,
|
|
114
|
+
error: { code: -32002, message: `Agent "${this.config.name}" 当前离线` },
|
|
115
|
+
};
|
|
116
|
+
}
|
|
105
117
|
const params = req.params;
|
|
106
118
|
const task = this.taskStore.createTask(params.from, this.config.name, params.message, params.callbackUrl);
|
|
107
119
|
this.onTaskReceived?.(task);
|
|
@@ -134,6 +146,43 @@ export class A2AServer {
|
|
|
134
146
|
}
|
|
135
147
|
return { jsonrpc: "2.0", id: req.id, result: task };
|
|
136
148
|
}
|
|
149
|
+
case "friends/request": {
|
|
150
|
+
const params = req.params;
|
|
151
|
+
const result = this.taskStore.createFriendRequest(params.from, this.config.name, params.message);
|
|
152
|
+
// 同时创建一条 task 消息,使 agent_inbox 能看到
|
|
153
|
+
const task = this.taskStore.createTask(params.from, this.config.name, `好友请求: ${params.message || "请求添加你为好友"}`);
|
|
154
|
+
this.onTaskReceived?.(task);
|
|
155
|
+
return { jsonrpc: "2.0", id: req.id, result: { requestId: result.id, status: "pending" } };
|
|
156
|
+
}
|
|
157
|
+
case "friends/respond": {
|
|
158
|
+
const params = req.params;
|
|
159
|
+
// 对方接受了我们的好友请求,本地直接添加好友关系(请求记录在对方数据库中)
|
|
160
|
+
if (params.accepted) {
|
|
161
|
+
this.taskStore.addFriend(this.config.name, params.from);
|
|
162
|
+
}
|
|
163
|
+
return { jsonrpc: "2.0", id: req.id, result: { ok: true } };
|
|
164
|
+
}
|
|
165
|
+
case "groups/invite": {
|
|
166
|
+
const params = req.params;
|
|
167
|
+
// 同时创建一条 task 消息,使 agent_inbox 能看到
|
|
168
|
+
const task = this.taskStore.createTask(params.from, this.config.name, `群组邀请: ${params.from} 邀请你加入群组「${params.groupName}」`);
|
|
169
|
+
this.onTaskReceived?.(task);
|
|
170
|
+
return { jsonrpc: "2.0", id: req.id, result: { ok: true } };
|
|
171
|
+
}
|
|
172
|
+
case "groups/message": {
|
|
173
|
+
const params = req.params;
|
|
174
|
+
// 跳过自己发出的消息(本地已存)
|
|
175
|
+
if (params.from === this.config.name) {
|
|
176
|
+
return { jsonrpc: "2.0", id: req.id, result: { ok: true } };
|
|
177
|
+
}
|
|
178
|
+
if (this.taskStore.isGroupMember(params.groupId, this.config.name)) {
|
|
179
|
+
this.taskStore.sendGroupMessage(params.groupId, params.from, params.message);
|
|
180
|
+
// 同时创建一条 task 消息,使 agent_inbox 能看到
|
|
181
|
+
const task = this.taskStore.createTask(params.from, this.config.name, `[群组消息] ${params.message}`);
|
|
182
|
+
this.onTaskReceived?.(task);
|
|
183
|
+
}
|
|
184
|
+
return { jsonrpc: "2.0", id: req.id, result: { ok: true } };
|
|
185
|
+
}
|
|
137
186
|
case "tasks/cancel": {
|
|
138
187
|
const params = req.params;
|
|
139
188
|
const task = this.taskStore.updateTask(params.taskId, {
|
|
@@ -156,12 +205,32 @@ export class A2AServer {
|
|
|
156
205
|
};
|
|
157
206
|
}
|
|
158
207
|
}
|
|
159
|
-
readBody(req) {
|
|
208
|
+
readBody(req, maxSize = 1024 * 1024, timeoutMs = 10000) {
|
|
160
209
|
return new Promise((resolve, reject) => {
|
|
161
210
|
const chunks = [];
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
211
|
+
let size = 0;
|
|
212
|
+
const timer = setTimeout(() => {
|
|
213
|
+
req.destroy();
|
|
214
|
+
reject(new Error("请求体读取超时"));
|
|
215
|
+
}, timeoutMs);
|
|
216
|
+
req.on("data", (chunk) => {
|
|
217
|
+
size += chunk.length;
|
|
218
|
+
if (size > maxSize) {
|
|
219
|
+
clearTimeout(timer);
|
|
220
|
+
req.destroy();
|
|
221
|
+
reject(new Error("请求体超出大小限制"));
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
chunks.push(chunk);
|
|
225
|
+
});
|
|
226
|
+
req.on("end", () => {
|
|
227
|
+
clearTimeout(timer);
|
|
228
|
+
resolve(Buffer.concat(chunks).toString());
|
|
229
|
+
});
|
|
230
|
+
req.on("error", (err) => {
|
|
231
|
+
clearTimeout(timer);
|
|
232
|
+
reject(err);
|
|
233
|
+
});
|
|
165
234
|
});
|
|
166
235
|
}
|
|
167
236
|
}
|
package/dist/a2a-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a2a-server.js","sourceRoot":"","sources":["../src/a2a-server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,MAAM,OAAO,SAAS;IACZ,MAAM,CAAc;IACpB,MAAM,CAAkB;IACxB,SAAS,CAAY;IACrB,cAAc,CAAwB;IACtC,cAAc,CAAkD;
|
|
1
|
+
{"version":3,"file":"a2a-server.js","sourceRoot":"","sources":["../src/a2a-server.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -1,11 +1,26 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
1
4
|
export const DEFAULT_A2A_PORT = 3456;
|
|
2
5
|
export const DEFAULT_API_PORT = 3457;
|
|
6
|
+
function loadConfigFile() {
|
|
7
|
+
try {
|
|
8
|
+
const content = readFileSync(path.join(homedir(), ".agent-link", "config.json"), "utf-8");
|
|
9
|
+
return JSON.parse(content);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
3
15
|
export function parseArgs(args) {
|
|
4
|
-
|
|
16
|
+
const fileConfig = loadConfigFile();
|
|
17
|
+
let name = fileConfig.name || `agent-${Math.random().toString(36).slice(2, 6)}`;
|
|
5
18
|
let port = DEFAULT_A2A_PORT;
|
|
6
19
|
let apiPort = DEFAULT_API_PORT;
|
|
7
|
-
let relayUrl;
|
|
20
|
+
let relayUrl = fileConfig.relayUrl || process.env.AGENT_LINK_RELAY_URL;
|
|
21
|
+
let noLocal = false;
|
|
8
22
|
let noMdns = false;
|
|
23
|
+
let noRelay = false;
|
|
9
24
|
const skills = [
|
|
10
25
|
{ id: "general", name: "通用", description: "通用任务处理" },
|
|
11
26
|
];
|
|
@@ -26,9 +41,15 @@ export function parseArgs(args) {
|
|
|
26
41
|
case "-r":
|
|
27
42
|
relayUrl = args[++i];
|
|
28
43
|
break;
|
|
44
|
+
case "--no-local":
|
|
45
|
+
noLocal = true;
|
|
46
|
+
break;
|
|
29
47
|
case "--no-mdns":
|
|
30
48
|
noMdns = true;
|
|
31
49
|
break;
|
|
50
|
+
case "--no-relay":
|
|
51
|
+
noRelay = true;
|
|
52
|
+
break;
|
|
32
53
|
case "--skills":
|
|
33
54
|
case "-s":
|
|
34
55
|
skills.length = 0;
|
|
@@ -38,6 +59,10 @@ export function parseArgs(args) {
|
|
|
38
59
|
break;
|
|
39
60
|
}
|
|
40
61
|
}
|
|
41
|
-
|
|
62
|
+
// --no-relay 时清除 relay URL
|
|
63
|
+
if (noRelay) {
|
|
64
|
+
relayUrl = undefined;
|
|
65
|
+
}
|
|
66
|
+
return { name, port, apiPort, relayUrl, noLocal, noMdns, noRelay, skills };
|
|
42
67
|
}
|
|
43
68
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|