@wings006/agent-link 0.1.2 → 0.1.3
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 +36 -242
- 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,82 @@
|
|
|
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 |
|
|
80
58
|
| `--relay` | `-r` | 中继服务器地址(跨网络通信) | 无 |
|
|
81
|
-
| `--no-mdns` | |
|
|
59
|
+
| `--no-mdns` | | 禁用局域网发现,仅用中继 | false |
|
|
82
60
|
| `--skills` | `-s` | 能力标签,逗号分隔 | general |
|
|
83
61
|
|
|
84
|
-
### 配置示例
|
|
85
|
-
|
|
86
|
-
**电脑 A(开发机,局域网):**
|
|
87
|
-
```json
|
|
88
|
-
{
|
|
89
|
-
"mcpServers": {
|
|
90
|
-
"agent-link": {
|
|
91
|
-
"command": "npx",
|
|
92
|
-
"args": ["-y", "@wings006/agent-link", "--name", "dev-macbook", "--skills", "code,test"]
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
**电脑 B(办公电脑,跨网络):**
|
|
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
|
-
```
|
|
109
|
-
|
|
110
62
|
## 使用
|
|
111
63
|
|
|
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
|
-
### 回复任务
|
|
64
|
+
配置完成后直接用自然语言和 Claude Code 对话:
|
|
144
65
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
## 消息流转
|
|
152
|
-
|
|
153
|
-
完整的一次跨机器任务流程:
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
1. A 用户 → A Claude Code: "告诉 office-pc 生成周报"
|
|
157
|
-
2. A Claude Code 调用 agent_list 确认 office-pc 在线
|
|
158
|
-
3. A Claude Code 调用 agent_send → A 的 agent-link 发送 HTTP 请求到 B
|
|
159
|
-
4. B 的 agent-link 收到任务,存入 inbox
|
|
160
|
-
5. B 的 Claude Code 通过 agent_inbox 看到新消息
|
|
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
|
-
```
|
|
66
|
+
- **"有哪些 agent 在线?"** → 调用 `agent_list`
|
|
67
|
+
- **"告诉 office-pc 帮我生成周报"** → 调用 `agent_send`
|
|
68
|
+
- **"看看有没有人给我发消息"** → 调用 `agent_inbox`
|
|
69
|
+
- **"回复这个任务"** → 调用 `agent_reply`
|
|
70
|
+
- **"标记全部已读"** → 调用 `agent_mark_read`
|
|
71
|
+
- **"清理已读消息"** → 调用 `agent_clear_inbox`
|
|
166
72
|
|
|
167
|
-
##
|
|
73
|
+
## 部署中继服务器
|
|
168
74
|
|
|
169
|
-
|
|
170
|
-
|------|------|
|
|
171
|
-
| `agent_list` | 列出所有在线 Agent(局域网 + 中继) |
|
|
172
|
-
| `agent_send` | 向目标 Agent 发送消息/任务 |
|
|
173
|
-
| `agent_inbox` | 查看收到的消息(显示已读/未读状态) |
|
|
174
|
-
| `agent_reply` | 回复任务(完成/拒绝/需要更多信息) |
|
|
175
|
-
| `agent_mark_read` | 标记消息已读(单条或全部) |
|
|
176
|
-
| `agent_clear_inbox` | 清理收件箱(已读/全部/最早N条) |
|
|
177
|
-
| `agent_task_status` | 查询已发出任务的状态和回复 |
|
|
178
|
-
|
|
179
|
-
## 跨网络通信(中继模式)
|
|
180
|
-
|
|
181
|
-
当 Agent 不在同一局域网时,可通过公网中继服务器实现通信。
|
|
182
|
-
|
|
183
|
-
### 部署中继服务器
|
|
184
|
-
|
|
185
|
-
在公网服务器上:
|
|
75
|
+
跨网络通信需要一台公网服务器作为中继:
|
|
186
76
|
|
|
187
77
|
```bash
|
|
188
|
-
# 创建目录
|
|
189
78
|
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
79
|
npm init -y
|
|
196
80
|
sed -i 's/"type": "commonjs"/"type": "module"/' package.json
|
|
197
81
|
npm install ws
|
|
198
82
|
|
|
83
|
+
# 从项目中复制中继服务器
|
|
84
|
+
scp dist/relay-server.js user@server:/opt/agent-link-relay/
|
|
85
|
+
|
|
199
86
|
# 启动
|
|
200
87
|
node relay-server.js --port 3458
|
|
201
88
|
```
|
|
202
89
|
|
|
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
|
-
```
|
|
242
|
-
|
|
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
|
-
## 本机测试
|
|
258
|
-
|
|
259
|
-
在同一台机器上模拟多 Agent 通信(使用不同端口):
|
|
260
|
-
|
|
261
|
-
**终端 1:**
|
|
262
|
-
```bash
|
|
263
|
-
agent-link --name agent-a --port 3456
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
**终端 2:**
|
|
267
|
-
```bash
|
|
268
|
-
agent-link --name agent-b --port 3457
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
两个进程会通过 mDNS 自动发现对方。
|
|
90
|
+
> 需要在云服务商安全组中放行 3458 端口(TCP 入方向)。
|
|
272
91
|
|
|
273
92
|
## 故障排查
|
|
274
93
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
如果两台电脑都配置了 agent-link 但 `agent_list` 看不到对方,使用调试脚本排查:
|
|
278
|
-
|
|
279
|
-
**电脑 A:**
|
|
280
|
-
```bash
|
|
281
|
-
npx tsx tests/mdns-debug.ts pc-a
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
**电脑 B:**
|
|
285
|
-
```bash
|
|
286
|
-
npx tsx tests/mdns-debug.ts pc-b
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
脚本会广播自身并监听局域网内的其他 Agent。如果 10 秒内双方都能看到 `[mDNS] 发现服务: ...` 输出,说明 mDNS 工作正常。
|
|
290
|
-
|
|
291
|
-
如果发现不了对方,常见原因:
|
|
292
|
-
|
|
293
|
-
| 原因 | 排查方法 |
|
|
94
|
+
| 问题 | 解决方法 |
|
|
294
95
|
|------|---------|
|
|
295
|
-
|
|
|
296
|
-
|
|
|
297
|
-
|
|
|
298
|
-
|
|
|
96
|
+
| `agent_list` 看不到对方 | 确认双方在同一局域网,或都配置了相同的 `--relay` |
|
|
97
|
+
| 发送消息失败 `fetch failed` | 检查是否有代理拦截,`.local` 域名需加入 `no_proxy` |
|
|
98
|
+
| daemon 参数不生效 | 完全退出 Claude Code 重新打开(不只是 `/mcp`) |
|
|
99
|
+
| 中继连接失败 | 确认中继服务器端口已放行,`ws://IP:端口` 格式正确 |
|
|
100
|
+
| mDNS 发现不到 | macOS 检查防火墙;确认同一子网;路由器启用多播转发 |
|
|
101
|
+
| 同机多实例冲突 | 不同实例使用不同的 `--port` 和 `--api-port` |
|
|
299
102
|
|
|
300
|
-
##
|
|
103
|
+
## 从源码开发
|
|
301
104
|
|
|
302
105
|
```bash
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
npm
|
|
306
|
-
npm run
|
|
106
|
+
git clone https://github.com/l3wingsgg/agent_link.git
|
|
107
|
+
cd agent_link
|
|
108
|
+
npm install
|
|
109
|
+
npm run build
|
|
110
|
+
npm test
|
|
307
111
|
```
|
|
308
112
|
|
|
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
113
|
## 许可证
|
|
320
114
|
|
|
321
115
|
MIT
|