agent-room 0.2.0
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 +446 -0
- package/dist/core/connection-manager.d.ts +66 -0
- package/dist/core/connection-manager.d.ts.map +1 -0
- package/dist/core/connection-manager.js +205 -0
- package/dist/core/connection-manager.js.map +1 -0
- package/dist/core/logger.d.ts +99 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +204 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/message-buffer.d.ts +42 -0
- package/dist/core/message-buffer.d.ts.map +1 -0
- package/dist/core/message-buffer.js +99 -0
- package/dist/core/message-buffer.js.map +1 -0
- package/dist/core/notification-engine.d.ts +38 -0
- package/dist/core/notification-engine.d.ts.map +1 -0
- package/dist/core/notification-engine.js +78 -0
- package/dist/core/notification-engine.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/protocols/adapter-interface.d.ts +6 -0
- package/dist/protocols/adapter-interface.d.ts.map +1 -0
- package/dist/protocols/adapter-interface.js +6 -0
- package/dist/protocols/adapter-interface.js.map +1 -0
- package/dist/protocols/sse-adapter.d.ts +26 -0
- package/dist/protocols/sse-adapter.d.ts.map +1 -0
- package/dist/protocols/sse-adapter.js +138 -0
- package/dist/protocols/sse-adapter.js.map +1 -0
- package/dist/protocols/ws-adapter.d.ts +26 -0
- package/dist/protocols/ws-adapter.d.ts.map +1 -0
- package/dist/protocols/ws-adapter.js +154 -0
- package/dist/protocols/ws-adapter.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +903 -0
- package/dist/server.js.map +1 -0
- package/dist/service/cli.d.ts +29 -0
- package/dist/service/cli.d.ts.map +1 -0
- package/dist/service/cli.js +479 -0
- package/dist/service/cli.js.map +1 -0
- package/dist/service/http-api.d.ts +29 -0
- package/dist/service/http-api.d.ts.map +1 -0
- package/dist/service/http-api.js +122 -0
- package/dist/service/http-api.js.map +1 -0
- package/dist/service/index.d.ts +22 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +80 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/protocol.d.ts +46 -0
- package/dist/service/protocol.d.ts.map +1 -0
- package/dist/service/protocol.js +81 -0
- package/dist/service/protocol.js.map +1 -0
- package/dist/service/room-manager.d.ts +88 -0
- package/dist/service/room-manager.d.ts.map +1 -0
- package/dist/service/room-manager.js +237 -0
- package/dist/service/room-manager.js.map +1 -0
- package/dist/service/test.d.ts +18 -0
- package/dist/service/test.d.ts.map +1 -0
- package/dist/service/test.js +260 -0
- package/dist/service/test.js.map +1 -0
- package/dist/service/user-manager.d.ts +68 -0
- package/dist/service/user-manager.d.ts.map +1 -0
- package/dist/service/user-manager.js +111 -0
- package/dist/service/user-manager.js.map +1 -0
- package/dist/service/ws-server.d.ts +34 -0
- package/dist/service/ws-server.d.ts.map +1 -0
- package/dist/service/ws-server.js +281 -0
- package/dist/service/ws-server.js.map +1 -0
- package/dist/test/echo-server.d.ts +12 -0
- package/dist/test/echo-server.d.ts.map +1 -0
- package/dist/test/echo-server.js +66 -0
- package/dist/test/echo-server.js.map +1 -0
- package/dist/test/integration-test.d.ts +13 -0
- package/dist/test/integration-test.d.ts.map +1 -0
- package/dist/test/integration-test.js +154 -0
- package/dist/test/integration-test.js.map +1 -0
- package/dist/test/reactive-test.d.ts +16 -0
- package/dist/test/reactive-test.d.ts.map +1 -0
- package/dist/test/reactive-test.js +128 -0
- package/dist/test/reactive-test.js.map +1 -0
- package/dist/test/send-hello.d.ts +2 -0
- package/dist/test/send-hello.d.ts.map +1 -0
- package/dist/test/send-hello.js +59 -0
- package/dist/test/send-hello.js.map +1 -0
- package/dist/test/service-mcp-test.d.ts +9 -0
- package/dist/test/service-mcp-test.d.ts.map +1 -0
- package/dist/test/service-mcp-test.js +127 -0
- package/dist/test/service-mcp-test.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/package.json +76 -0
package/README.md
ADDED
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
# AgentRoom
|
|
2
|
+
|
|
3
|
+
MCP 流桥接工具 + 可部署的实时消息服务。
|
|
4
|
+
|
|
5
|
+
项目分为两个独立模块:
|
|
6
|
+
|
|
7
|
+
| 模块 | 用途 | 运行环境 |
|
|
8
|
+
|------|------|----------|
|
|
9
|
+
| **MCP** | 让 IDE(Cursor)和 CLI 工具连接任意 WebSocket/SSE 数据流,或直接接入 Service | 本地 |
|
|
10
|
+
| **Service** | 可部署到云服务器的实时消息服务,支持房间和私聊 | 云端 / 本地 |
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 安装
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# 全局安装(推荐)
|
|
18
|
+
npm install -g agent-room
|
|
19
|
+
|
|
20
|
+
# 或作为项目依赖
|
|
21
|
+
npm install agent-room
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 快速开始
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# 启动消息服务(本地测试)
|
|
28
|
+
agent-room-service
|
|
29
|
+
# 或
|
|
30
|
+
npx agent-room-service
|
|
31
|
+
|
|
32
|
+
# 启动 CLI 聊天客户端
|
|
33
|
+
agent-room-cli --name Alice --room general
|
|
34
|
+
# 或
|
|
35
|
+
npx agent-room-cli
|
|
36
|
+
|
|
37
|
+
# 运行服务集成测试
|
|
38
|
+
pnpm run service:test
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 模块一:MCP(IDE + CLI)
|
|
44
|
+
|
|
45
|
+
AgentRoom MCP 是一个 [Model Context Protocol](https://modelcontextprotocol.io/) 服务器,为 AI 提供连接和操作实时数据流的能力。
|
|
46
|
+
|
|
47
|
+
### 接入 Cursor
|
|
48
|
+
|
|
49
|
+
**方式一:通过 npm 包(推荐,已发布后可用)**
|
|
50
|
+
|
|
51
|
+
在 Cursor 的 MCP 配置(`~/.cursor/mcp.json` 或项目 `.cursor/mcp.json`)中添加:
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"mcpServers": {
|
|
56
|
+
"agent-room": {
|
|
57
|
+
"command": "npx",
|
|
58
|
+
"args": ["-y", "agent-room"]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**方式二:本地开发模式**
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"mcpServers": {
|
|
69
|
+
"agent-room": {
|
|
70
|
+
"command": "npx",
|
|
71
|
+
"args": ["tsx", "src/index.ts"],
|
|
72
|
+
"cwd": "/path/to/agent-room"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
重启 Cursor 后,AI 即可使用以下工具。
|
|
79
|
+
|
|
80
|
+
### MCP 工具列表
|
|
81
|
+
|
|
82
|
+
| 工具 | 说明 |
|
|
83
|
+
|------|------|
|
|
84
|
+
| `connect_stream` | 连接 WebSocket (`ws://`) 或 SSE (`http://`) 端点,返回 channel ID |
|
|
85
|
+
| `connect_service` | **连接远程 AgentRoom Service**,自动完成认证和加入房间 |
|
|
86
|
+
| `disconnect_stream` | 断开指定频道 |
|
|
87
|
+
| `list_connections` | 列出所有活跃连接及状态 |
|
|
88
|
+
| `send_message` | 通过已连接的频道发送消息(Service 频道自动包装为聊天协议) |
|
|
89
|
+
| `read_history` | 查看频道的历史消息(支持数量、关键词过滤、JSON/文本格式) |
|
|
90
|
+
| `wait_for_message` | 阻塞等待频道的下一条消息(支持关键词过滤,超时返回) |
|
|
91
|
+
| `watch_stream` | 连接 + 等待第一条消息(`connect_stream` + `wait_for_message` 的组合) |
|
|
92
|
+
| `open_chat_terminal` | 自动打开一个 CLI 聊天终端(连接 Service,加入房间,用户可实时观察和参与聊天) |
|
|
93
|
+
|
|
94
|
+
> `connect_service` 与 `connect_stream` 的区别:
|
|
95
|
+
> - `connect_stream` — 连接任意原始 WebSocket/SSE 端点
|
|
96
|
+
> - `connect_service` — 专门连接 AgentRoom Service,自动完成 auth + join,`send_message` 自动包装为聊天格式,接收消息自动解码为可读文本
|
|
97
|
+
|
|
98
|
+
### MCP 资源
|
|
99
|
+
|
|
100
|
+
| 资源 URI | 说明 |
|
|
101
|
+
|----------|------|
|
|
102
|
+
| `connection://status` | 所有连接的状态摘要 |
|
|
103
|
+
| `connection://{channel_id}/status` | 单个频道的详细状态 |
|
|
104
|
+
| `stream://{channel_id}/messages/recent` | 频道最近 50 条消息 |
|
|
105
|
+
| `stream://{channel_id}/messages/latest` | 频道最新一条消息 |
|
|
106
|
+
|
|
107
|
+
### 在 Cursor 中使用示例
|
|
108
|
+
|
|
109
|
+
**简单方式(使用 connect_service):**
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
帮我连接 ws://my-server:9000 的 general 房间,用户名 CursorAI,然后监听消息并回复。
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
AI 会调用 `connect_service` → `wait_for_message` → `send_message`,全程自动处理协议细节。
|
|
116
|
+
|
|
117
|
+
**进阶方式(使用 connect_stream):**
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
帮我连接 ws://localhost:9000,发送认证和加入房间的 JSON,然后监听消息。
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 独立运行(不通过 Cursor)
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# stdio 模式(默认,供 MCP 客户端连接)
|
|
127
|
+
agent-room
|
|
128
|
+
# 或
|
|
129
|
+
npx agent-room
|
|
130
|
+
|
|
131
|
+
# HTTP 模式(远程部署)
|
|
132
|
+
agent-room --transport http --port 3000
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 模块二:Service(消息服务)
|
|
138
|
+
|
|
139
|
+
可独立部署到云服务器的实时消息服务,提供房间聊天和私聊能力。
|
|
140
|
+
|
|
141
|
+
### 启动
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# 默认端口 9000
|
|
145
|
+
agent-room-service
|
|
146
|
+
|
|
147
|
+
# 自定义端口和绑定地址
|
|
148
|
+
PORT=8080 HOST=0.0.0.0 agent-room-service
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
启动后同时提供 **WebSocket** 和 **HTTP API** 两个接口(同一端口)。
|
|
152
|
+
|
|
153
|
+
### CLI 聊天客户端
|
|
154
|
+
|
|
155
|
+
配套终端客户端,提供完整的聊天室体验:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
# 启动 CLI(默认连接 localhost:9000,加入 #general)
|
|
159
|
+
agent-room-cli
|
|
160
|
+
|
|
161
|
+
# 自定义参数
|
|
162
|
+
agent-room-cli --name Alice --room dev-ops --url ws://server:9000
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**消息显示分层:**
|
|
166
|
+
|
|
167
|
+
| 类型 | 显示方式 | 示例 |
|
|
168
|
+
|------|----------|------|
|
|
169
|
+
| 聊天消息 | 高亮显示(推送消息) | `Alice 大家好!` |
|
|
170
|
+
| 私聊 DM | 紫色标记 | `[DM from Bob] 你好` |
|
|
171
|
+
| 用户加入/离开 | 灰色淡显(系统事件) | `→ Bob joined #general` |
|
|
172
|
+
| 历史消息 | 灰色区块 | `── History #general ──` |
|
|
173
|
+
| 信令响应 | 默认隐藏(`/debug` 开启) | 认证结果、房间列表等 |
|
|
174
|
+
|
|
175
|
+
**CLI 命令:**
|
|
176
|
+
|
|
177
|
+
| 命令 | 快捷键 | 说明 |
|
|
178
|
+
|------|--------|------|
|
|
179
|
+
| `/join <room>` | `/j` | 加入房间 |
|
|
180
|
+
| `/leave [room]` | `/l` | 离开当前或指定房间 |
|
|
181
|
+
| `/switch <room>` | `/s` | 切换活跃房间 |
|
|
182
|
+
| `/rooms` | `/r` | 列出所有房间 |
|
|
183
|
+
| `/members [room]` | `/m` | 查看房间成员 |
|
|
184
|
+
| `/users` | `/u` | 查看在线用户 |
|
|
185
|
+
| `/dm <user> <msg>` | `/d` | 发送私聊 |
|
|
186
|
+
| `/create <id> [name]` | `/c` | 创建新房间 |
|
|
187
|
+
| `/history` | | 查看当前房间历史 |
|
|
188
|
+
| `/debug` | | 切换信令消息可见性 |
|
|
189
|
+
| `/quit` | `/q` | 退出 |
|
|
190
|
+
|
|
191
|
+
直接输入文字即发送到当前活跃房间。
|
|
192
|
+
|
|
193
|
+
### WebSocket 协议
|
|
194
|
+
|
|
195
|
+
连接地址:`ws://your-server:9000`
|
|
196
|
+
|
|
197
|
+
所有消息为 JSON 格式,统一信封结构:
|
|
198
|
+
|
|
199
|
+
```json
|
|
200
|
+
{
|
|
201
|
+
"id": "abc12345",
|
|
202
|
+
"type": "action | chat | system | response | error",
|
|
203
|
+
"from": "sender",
|
|
204
|
+
"to": "target (optional)",
|
|
205
|
+
"timestamp": "2026-02-06T12:00:00.000Z",
|
|
206
|
+
"payload": { ... }
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
#### 连接流程
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
1. 客户端连接 WebSocket
|
|
214
|
+
2. 服务端发送 welcome (type: "system")
|
|
215
|
+
3. 客户端发送认证 (type: "action", action: "auth")
|
|
216
|
+
4. 服务端返回认证结果 + 房间列表
|
|
217
|
+
5. 客户端加入房间 / 发消息 / 私聊
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
#### Action 列表
|
|
221
|
+
|
|
222
|
+
**认证(必须先执行):**
|
|
223
|
+
|
|
224
|
+
```json
|
|
225
|
+
{
|
|
226
|
+
"type": "action",
|
|
227
|
+
"from": "client",
|
|
228
|
+
"payload": { "action": "auth", "name": "Alice" }
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**房间操作:**
|
|
233
|
+
|
|
234
|
+
```json
|
|
235
|
+
// 列出所有房间
|
|
236
|
+
{ "type": "action", "from": "me", "payload": { "action": "room.list" } }
|
|
237
|
+
|
|
238
|
+
// 创建房间
|
|
239
|
+
{ "type": "action", "from": "me", "payload": { "action": "room.create", "room_id": "dev-ops", "name": "DevOps", "description": "运维频道" } }
|
|
240
|
+
|
|
241
|
+
// 加入房间
|
|
242
|
+
{ "type": "action", "from": "me", "payload": { "action": "room.join", "room_id": "general" } }
|
|
243
|
+
|
|
244
|
+
// 离开房间
|
|
245
|
+
{ "type": "action", "from": "me", "payload": { "action": "room.leave", "room_id": "general" } }
|
|
246
|
+
|
|
247
|
+
// 查看房间成员
|
|
248
|
+
{ "type": "action", "from": "me", "payload": { "action": "room.members", "room_id": "general" } }
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**发送房间消息:**
|
|
252
|
+
|
|
253
|
+
```json
|
|
254
|
+
{
|
|
255
|
+
"type": "chat",
|
|
256
|
+
"from": "Alice",
|
|
257
|
+
"to": "room:general",
|
|
258
|
+
"payload": { "message": "大家好!" }
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
所有房间成员(包括发送者)都会收到该消息。
|
|
263
|
+
|
|
264
|
+
**私聊 DM:**
|
|
265
|
+
|
|
266
|
+
```json
|
|
267
|
+
{
|
|
268
|
+
"type": "action",
|
|
269
|
+
"from": "me",
|
|
270
|
+
"payload": { "action": "dm", "to": "Bob", "message": "你好,私密消息" }
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
或使用 chat 类型直接发送:
|
|
275
|
+
|
|
276
|
+
```json
|
|
277
|
+
{
|
|
278
|
+
"type": "chat",
|
|
279
|
+
"from": "Alice",
|
|
280
|
+
"to": "Bob",
|
|
281
|
+
"payload": { "message": "私聊消息" }
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**其他:**
|
|
286
|
+
|
|
287
|
+
```json
|
|
288
|
+
// 在线用户列表
|
|
289
|
+
{ "type": "action", "from": "me", "payload": { "action": "users.list" } }
|
|
290
|
+
|
|
291
|
+
// 心跳
|
|
292
|
+
{ "type": "action", "from": "me", "payload": { "action": "ping" } }
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
#### 服务端推送事件
|
|
296
|
+
|
|
297
|
+
服务端会主动推送以下 system 类型消息:
|
|
298
|
+
|
|
299
|
+
| event | 说明 |
|
|
300
|
+
|-------|------|
|
|
301
|
+
| `welcome` | 连接成功 |
|
|
302
|
+
| `user.joined` | 有用户加入你所在的房间 |
|
|
303
|
+
| `user.left` | 有用户离开你所在的房间 |
|
|
304
|
+
| `room.history` | 加入房间时推送最近 20 条历史消息 |
|
|
305
|
+
|
|
306
|
+
### HTTP API
|
|
307
|
+
|
|
308
|
+
| 端点 | 说明 |
|
|
309
|
+
|------|------|
|
|
310
|
+
| `GET /health` | 健康检查,返回 `{ "status": "ok" }` |
|
|
311
|
+
| `GET /stats` | 统计信息:连接数、房间数、在线用户数 |
|
|
312
|
+
| `GET /rooms` | 列出所有房间及详情 |
|
|
313
|
+
| `GET /rooms/:id` | 查看指定房间的成员列表 |
|
|
314
|
+
| `GET /users` | 列出所有在线用户 |
|
|
315
|
+
|
|
316
|
+
### 默认房间
|
|
317
|
+
|
|
318
|
+
服务启动后自动创建两个持久化房间:
|
|
319
|
+
|
|
320
|
+
- `general` — 默认公共频道
|
|
321
|
+
- `random` — 闲聊频道
|
|
322
|
+
|
|
323
|
+
这两个房间不会因为无人而被删除。用户创建的房间在所有成员离开后自动删除(除非设置 `persistent: true`)。
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## MCP + Service + CLI 联动
|
|
328
|
+
|
|
329
|
+
典型流程:AI 加入聊天室并自动打开一个 CLI 终端供用户实时观察和参与。
|
|
330
|
+
|
|
331
|
+
```
|
|
332
|
+
用户对 AI 说:"帮我加入 general 房间聊天"
|
|
333
|
+
↓
|
|
334
|
+
Cursor AI → MCP connect_service(ws://server:9000) 一键连接 + 认证 + 入房
|
|
335
|
+
→ MCP open_chat_terminal(room: general) 自动打开 CLI 终端
|
|
336
|
+
→ MCP wait_for_message(监听房间消息) 等待消息
|
|
337
|
+
↓
|
|
338
|
+
用户在 CLI 终端中看到实时消息流,可以随时输入参与聊天
|
|
339
|
+
AI 在 Cursor 中收到消息后自动分析和回复
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
**对 AI 的指令示例:**
|
|
343
|
+
|
|
344
|
+
```
|
|
345
|
+
帮我连接 ws://my-server:9000 的 general 房间,打开一个 CLI 让我也能聊天,然后帮我监听消息。
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## 项目结构
|
|
351
|
+
|
|
352
|
+
```
|
|
353
|
+
src/
|
|
354
|
+
types.ts # 共享类型定义
|
|
355
|
+
core/
|
|
356
|
+
connection-manager.ts # 多连接管理(WebSocket / SSE)
|
|
357
|
+
message-buffer.ts # 滑动窗口消息缓冲
|
|
358
|
+
notification-engine.ts # MCP 通知防抖引擎
|
|
359
|
+
protocols/
|
|
360
|
+
ws-adapter.ts # WebSocket 适配器(自动重连 + 心跳)
|
|
361
|
+
sse-adapter.ts # SSE 适配器(自动重连)
|
|
362
|
+
adapter-interface.ts # 适配器类型导出
|
|
363
|
+
server.ts # MCP 服务器定义(工具 + 资源)
|
|
364
|
+
index.ts # MCP 入口(stdio / HTTP 传输)
|
|
365
|
+
service/
|
|
366
|
+
protocol.ts # Service 消息协议定义
|
|
367
|
+
user-manager.ts # 用户会话管理
|
|
368
|
+
room-manager.ts # 房间管理(创建/加入/离开/广播)
|
|
369
|
+
ws-server.ts # WebSocket 消息路由
|
|
370
|
+
http-api.ts # HTTP REST API
|
|
371
|
+
index.ts # Service 入口
|
|
372
|
+
cli.ts # 终端聊天客户端(推送/信令分层显示)
|
|
373
|
+
test.ts # 集成测试
|
|
374
|
+
test/
|
|
375
|
+
echo-server.ts # WebSocket 回声服务器(测试用)
|
|
376
|
+
service-mcp-test.ts # MCP-Service 集成测试
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## Scripts
|
|
380
|
+
|
|
381
|
+
```bash
|
|
382
|
+
# ─── 通过 npm bin(安装后)─────────────────────
|
|
383
|
+
agent-room # 启动 MCP 服务器(stdio 模式)
|
|
384
|
+
agent-room-service # 启动消息服务
|
|
385
|
+
agent-room-cli # 启动 CLI 聊天客户端
|
|
386
|
+
|
|
387
|
+
# ─── 通过 pnpm(开发模式)─────────────────────
|
|
388
|
+
pnpm run dev # 启动 MCP 服务器(stdio 模式)
|
|
389
|
+
pnpm run service # 启动消息服务
|
|
390
|
+
pnpm run service:cli # 启动 CLI 聊天客户端
|
|
391
|
+
pnpm run service:test # 运行服务集成测试
|
|
392
|
+
pnpm run build # TypeScript 编译
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## 部署
|
|
396
|
+
|
|
397
|
+
### Node.js 直接部署
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
# 安装
|
|
401
|
+
npm install -g agent-room
|
|
402
|
+
|
|
403
|
+
# 启动服务
|
|
404
|
+
PORT=9000 agent-room-service
|
|
405
|
+
|
|
406
|
+
# 或编译后运行
|
|
407
|
+
pnpm run build
|
|
408
|
+
PORT=9000 node dist/service/index.js
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
### Docker 部署
|
|
412
|
+
|
|
413
|
+
```bash
|
|
414
|
+
# 构建
|
|
415
|
+
docker build -t agent-room-service .
|
|
416
|
+
|
|
417
|
+
# 运行
|
|
418
|
+
docker run -d -p 9000:9000 --name agent-room agent-room-service
|
|
419
|
+
|
|
420
|
+
# 自定义端口
|
|
421
|
+
docker run -d -p 8080:8080 -e PORT=8080 agent-room-service
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### 发布到 npm
|
|
425
|
+
|
|
426
|
+
```bash
|
|
427
|
+
# 编译(prepublishOnly 自动执行)
|
|
428
|
+
npm publish
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
发布后,任何人都可以:
|
|
432
|
+
|
|
433
|
+
```bash
|
|
434
|
+
# 运行 MCP 服务器
|
|
435
|
+
npx agent-room
|
|
436
|
+
|
|
437
|
+
# 运行消息服务
|
|
438
|
+
npx agent-room-service
|
|
439
|
+
|
|
440
|
+
# 运行 CLI
|
|
441
|
+
npx agent-room-cli --url ws://server:9000 --name Alice
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
## License
|
|
445
|
+
|
|
446
|
+
MIT
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { type ConnectionInfo, type ProtocolType, type AdapterOptions } from "../types.js";
|
|
3
|
+
export interface ConnectionManagerEvents {
|
|
4
|
+
/** A new message arrived on a channel */
|
|
5
|
+
message: (channelId: string, data: string) => void;
|
|
6
|
+
/** A connection's state changed */
|
|
7
|
+
stateChange: (channelId: string, info: ConnectionInfo) => void;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Manages multiple concurrent stream connections, each identified by a channelId.
|
|
11
|
+
* Delegates actual protocol handling to WsAdapter / SseAdapter.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ConnectionManager extends EventEmitter {
|
|
14
|
+
private _connections;
|
|
15
|
+
/**
|
|
16
|
+
* Open a new stream connection.
|
|
17
|
+
* Returns the channelId (auto-generated if not provided).
|
|
18
|
+
*/
|
|
19
|
+
connect(url: string, protocol: ProtocolType, channelId?: string, options?: AdapterOptions): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Disconnect a channel.
|
|
22
|
+
*/
|
|
23
|
+
disconnect(channelId: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Disconnect all channels.
|
|
26
|
+
*/
|
|
27
|
+
disconnectAll(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Send data through a specific channel.
|
|
30
|
+
*/
|
|
31
|
+
send(channelId: string, data: string): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Get info for a specific channel.
|
|
34
|
+
*/
|
|
35
|
+
getConnectionInfo(channelId: string): ConnectionInfo | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* List all active connections.
|
|
38
|
+
*/
|
|
39
|
+
listConnections(): ConnectionInfo[];
|
|
40
|
+
/**
|
|
41
|
+
* Check if a channel exists.
|
|
42
|
+
*/
|
|
43
|
+
has(channelId: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Wait for the next message on a channel, with optional substring filter.
|
|
46
|
+
* Returns a Promise that resolves with the raw message data, or rejects on timeout.
|
|
47
|
+
*
|
|
48
|
+
* @param channelId The channel to listen on
|
|
49
|
+
* @param timeoutMs Max time to wait (default 30000ms)
|
|
50
|
+
* @param filter Optional substring — only messages containing this string will resolve the promise
|
|
51
|
+
* @returns The raw message string that matched
|
|
52
|
+
*/
|
|
53
|
+
waitForMessage(channelId: string, timeoutMs?: number, filter?: string): Promise<{
|
|
54
|
+
data: string;
|
|
55
|
+
timedOut: false;
|
|
56
|
+
} | {
|
|
57
|
+
data: null;
|
|
58
|
+
timedOut: true;
|
|
59
|
+
}>;
|
|
60
|
+
private _createAdapter;
|
|
61
|
+
private _toInfo;
|
|
62
|
+
private _emitStateChange;
|
|
63
|
+
on<K extends keyof ConnectionManagerEvents>(event: K, listener: ConnectionManagerEvents[K]): this;
|
|
64
|
+
emit<K extends keyof ConnectionManagerEvents>(event: K, ...args: Parameters<ConnectionManagerEvents[K]>): boolean;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=connection-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-manager.d.ts","sourceRoot":"","sources":["../../src/core/connection-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,cAAc,EAEpB,MAAM,aAAa,CAAC;AAoBrB,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,mCAAmC;IACnC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CAChE;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,OAAO,CAAC,YAAY,CAAwC;IAI5D;;;OAGG;IACG,OAAO,CACX,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,YAAY,EACtB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC;IAkElB;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAKpC;;OAEG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1D;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAMhE;;OAEG;IACH,eAAe,IAAI,cAAc,EAAE;IAInC;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/B;;;;;;;;OAQG;IACH,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAe,EAC1B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,KAAK,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE,CAAC;IAiC9E,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,gBAAgB;IAKf,EAAE,CAAC,CAAC,SAAS,MAAM,uBAAuB,EACjD,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,uBAAuB,CAAC,CAAC,CAAC,GACnC,IAAI;IAIE,IAAI,CAAC,CAAC,SAAS,MAAM,uBAAuB,EACnD,KAAK,EAAE,CAAC,EACR,GAAG,IAAI,EAAE,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,GAC9C,OAAO;CAGX"}
|