aws-runtime-bridge 1.1.1 → 1.1.2

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.
Files changed (97) hide show
  1. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +166 -0
  2. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -0
  3. package/package/aws-client-agent-mcp/dist/agent-client.js +602 -0
  4. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -0
  5. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts +2 -0
  6. package/package/aws-client-agent-mcp/dist/agent-client.test.d.ts.map +1 -0
  7. package/package/aws-client-agent-mcp/dist/agent-client.test.js +534 -0
  8. package/package/aws-client-agent-mcp/dist/agent-client.test.js.map +1 -0
  9. package/package/aws-client-agent-mcp/dist/config.d.ts +22 -0
  10. package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -0
  11. package/package/aws-client-agent-mcp/dist/config.js +106 -0
  12. package/package/aws-client-agent-mcp/dist/config.js.map +1 -0
  13. package/package/aws-client-agent-mcp/dist/config.test.d.ts +2 -0
  14. package/package/aws-client-agent-mcp/dist/config.test.d.ts.map +1 -0
  15. package/package/aws-client-agent-mcp/dist/config.test.js +139 -0
  16. package/package/aws-client-agent-mcp/dist/config.test.js.map +1 -0
  17. package/package/aws-client-agent-mcp/dist/constants.d.ts +15 -0
  18. package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -0
  19. package/package/aws-client-agent-mcp/dist/constants.js +19 -0
  20. package/package/aws-client-agent-mcp/dist/constants.js.map +1 -0
  21. package/package/aws-client-agent-mcp/dist/http-client.d.ts +28 -0
  22. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -0
  23. package/package/aws-client-agent-mcp/dist/http-client.js +96 -0
  24. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -0
  25. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts +2 -0
  26. package/package/aws-client-agent-mcp/dist/http-client.test.d.ts.map +1 -0
  27. package/package/aws-client-agent-mcp/dist/http-client.test.js +228 -0
  28. package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -0
  29. package/package/aws-client-agent-mcp/dist/index.d.ts +14 -0
  30. package/package/aws-client-agent-mcp/dist/index.d.ts.map +1 -0
  31. package/package/aws-client-agent-mcp/dist/index.js +30 -0
  32. package/package/aws-client-agent-mcp/dist/index.js.map +1 -0
  33. package/package/aws-client-agent-mcp/dist/logger.d.ts +7 -0
  34. package/package/aws-client-agent-mcp/dist/logger.d.ts.map +1 -0
  35. package/package/aws-client-agent-mcp/dist/logger.js +19 -0
  36. package/package/aws-client-agent-mcp/dist/logger.js.map +1 -0
  37. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +77 -0
  38. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -0
  39. package/package/aws-client-agent-mcp/dist/mcp-server.js +438 -0
  40. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -0
  41. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts +2 -0
  42. package/package/aws-client-agent-mcp/dist/mcp-server.test.d.ts.map +1 -0
  43. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +624 -0
  44. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -0
  45. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +78 -0
  46. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -0
  47. package/package/aws-client-agent-mcp/dist/mcp-tools.js +420 -0
  48. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -0
  49. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +61 -0
  50. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -0
  51. package/package/aws-client-agent-mcp/dist/memory-store.js +268 -0
  52. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -0
  53. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts +2 -0
  54. package/package/aws-client-agent-mcp/dist/memory-store.test.d.ts.map +1 -0
  55. package/package/aws-client-agent-mcp/dist/memory-store.test.js +164 -0
  56. package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -0
  57. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +87 -0
  58. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -0
  59. package/package/aws-client-agent-mcp/dist/message-buffer.js +185 -0
  60. package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -0
  61. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts +2 -0
  62. package/package/aws-client-agent-mcp/dist/message-buffer.test.d.ts.map +1 -0
  63. package/package/aws-client-agent-mcp/dist/message-buffer.test.js +44 -0
  64. package/package/aws-client-agent-mcp/dist/message-buffer.test.js.map +1 -0
  65. package/package/aws-client-agent-mcp/dist/messageContent.d.ts +53 -0
  66. package/package/aws-client-agent-mcp/dist/messageContent.d.ts.map +1 -0
  67. package/package/aws-client-agent-mcp/dist/messageContent.js +125 -0
  68. package/package/aws-client-agent-mcp/dist/messageContent.js.map +1 -0
  69. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts +3 -0
  70. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +1 -0
  71. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +50 -0
  72. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +1 -0
  73. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts +2 -0
  74. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.d.ts.map +1 -0
  75. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +90 -0
  76. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +1 -0
  77. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +66 -0
  78. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -0
  79. package/package/aws-client-agent-mcp/dist/status-reporter.js +237 -0
  80. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -0
  81. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts +2 -0
  82. package/package/aws-client-agent-mcp/dist/status-reporter.test.d.ts.map +1 -0
  83. package/package/aws-client-agent-mcp/dist/status-reporter.test.js +19 -0
  84. package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -0
  85. package/package/aws-client-agent-mcp/dist/types.d.ts +309 -0
  86. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -0
  87. package/package/aws-client-agent-mcp/dist/types.js +9 -0
  88. package/package/aws-client-agent-mcp/dist/types.js.map +1 -0
  89. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +94 -0
  90. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -0
  91. package/package/aws-client-agent-mcp/dist/websocket-client.js +316 -0
  92. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -0
  93. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts +2 -0
  94. package/package/aws-client-agent-mcp/dist/websocket-client.test.d.ts.map +1 -0
  95. package/package/aws-client-agent-mcp/dist/websocket-client.test.js +191 -0
  96. package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +1 -0
  97. package/package.json +1 -1
@@ -0,0 +1,624 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, it } from "node:test";
3
+ import { AgentClient } from "./agent-client.js";
4
+ import { McpServer } from "./mcp-server.js";
5
+ import { MessageBuffer } from "./message-buffer.js";
6
+ function createServerWithUnread(unreadMessages, overrides = {}) {
7
+ const server = new McpServer();
8
+ Reflect.set(server, "messageBuffer", new MessageBuffer());
9
+ const agentClientStub = {
10
+ fetchUnreadMessages: async () => unreadMessages,
11
+ getStatusReporter: () => null,
12
+ getMyTasks: async () => [],
13
+ getState: () => ({
14
+ agentId: "agent-self",
15
+ displayName: "Self Agent",
16
+ isConnected: true,
17
+ isRegistered: true,
18
+ }),
19
+ ...overrides,
20
+ };
21
+ Reflect.set(server, "agentClient", agentClientStub);
22
+ return server;
23
+ }
24
+ describe("McpServer unread backlog hydration", () => {
25
+ it("poll_message should return unread direct and group messages fetched after restart", async () => {
26
+ const directMessage = {
27
+ msgId: "dm-offline-1",
28
+ senderId: "agent-b",
29
+ senderName: "Agent B",
30
+ content: "offline dm",
31
+ requireReply: false,
32
+ timestamp: new Date().toISOString(),
33
+ };
34
+ const groupMessage = {
35
+ msgId: 101,
36
+ senderId: "agent-c",
37
+ senderName: "Agent C",
38
+ content: "offline group",
39
+ timestamp: new Date().toISOString(),
40
+ projectName: "demo",
41
+ };
42
+ const server = createServerWithUnread({
43
+ directMessages: [directMessage],
44
+ groupMessages: [groupMessage],
45
+ });
46
+ const handleToolCall = Reflect.get(server, "handleToolCall");
47
+ const result = await handleToolCall.call(server, "poll_message", {});
48
+ assert.deepEqual(result, {
49
+ directMessages: [directMessage],
50
+ groupMessages: [groupMessage],
51
+ fromBuffer: true,
52
+ });
53
+ });
54
+ it("get_message should return unread messages fetched when local buffer is empty", async () => {
55
+ const directMessage = {
56
+ msgId: "dm-offline-2",
57
+ senderId: "agent-d",
58
+ senderName: "Agent D",
59
+ content: "wake up dm",
60
+ requireReply: false,
61
+ timestamp: new Date().toISOString(),
62
+ };
63
+ const server = createServerWithUnread({
64
+ directMessages: [directMessage],
65
+ groupMessages: [],
66
+ });
67
+ const handleToolCall = Reflect.get(server, "handleToolCall");
68
+ const result = await handleToolCall.call(server, "get_message", {});
69
+ assert.deepEqual(result, {
70
+ directMessages: [directMessage],
71
+ groupMessages: [],
72
+ fromBuffer: false,
73
+ });
74
+ });
75
+ it("get_message should still hydrate unread group messages after profile push is received", async () => {
76
+ const groupMessage = {
77
+ msgId: 301,
78
+ senderId: "agent-e",
79
+ senderName: "Agent E",
80
+ content: "offline group after profile",
81
+ timestamp: new Date().toISOString(),
82
+ projectName: "demo",
83
+ roomId: "inner_group:g-1",
84
+ };
85
+ const server = createServerWithUnread({
86
+ directMessages: [],
87
+ groupMessages: [groupMessage],
88
+ });
89
+ const messageBuffer = Reflect.get(server, "messageBuffer");
90
+ messageBuffer.setProfileMessage({
91
+ id: "agent-1",
92
+ displayName: "Agent One",
93
+ roleName: "Backend Agent",
94
+ prompt: "prompt",
95
+ isOnline: true,
96
+ onlineSince: new Date().toISOString(),
97
+ createdAt: new Date().toISOString(),
98
+ projectName: "demo",
99
+ });
100
+ const handleToolCall = Reflect.get(server, "handleToolCall");
101
+ const result = (await handleToolCall.call(server, "get_message", {}));
102
+ assert.equal(result.fromBuffer, false);
103
+ assert.deepEqual(result.directMessages, []);
104
+ assert.deepEqual(result.groupMessages, [groupMessage]);
105
+ });
106
+ it("get_message should filter out self-sent unread group messages fetched from server", async () => {
107
+ const selfGroupMessage = {
108
+ msgId: 401,
109
+ senderId: "agent-self",
110
+ senderName: "Self Agent",
111
+ content: "my own group message",
112
+ timestamp: new Date().toISOString(),
113
+ projectName: "demo",
114
+ roomId: "project:demo",
115
+ };
116
+ const otherGroupMessage = {
117
+ msgId: 402,
118
+ senderId: "agent-other",
119
+ senderName: "Other Agent",
120
+ content: "other group message",
121
+ timestamp: new Date().toISOString(),
122
+ projectName: "demo",
123
+ roomId: "project:demo",
124
+ };
125
+ const server = createServerWithUnread({
126
+ directMessages: [],
127
+ groupMessages: [selfGroupMessage, otherGroupMessage],
128
+ });
129
+ Reflect.set(server, "agentClient", {
130
+ fetchUnreadMessages: async () => ({
131
+ directMessages: [],
132
+ groupMessages: [selfGroupMessage, otherGroupMessage],
133
+ }),
134
+ getState: () => ({
135
+ agentId: "agent-self",
136
+ displayName: "Self Agent",
137
+ isConnected: true,
138
+ isRegistered: true,
139
+ }),
140
+ getMyTasks: async () => [],
141
+ getStatusReporter: () => null,
142
+ });
143
+ const handleToolCall = Reflect.get(server, "handleToolCall");
144
+ const result = await handleToolCall.call(server, "get_message", {});
145
+ assert.deepEqual(result, {
146
+ directMessages: [],
147
+ groupMessages: [otherGroupMessage],
148
+ fromBuffer: false,
149
+ });
150
+ });
151
+ it("get_message should inject non-persistent task notification when active tasks exist", async () => {
152
+ const server = createServerWithUnread({
153
+ directMessages: [],
154
+ groupMessages: [],
155
+ }, {
156
+ getMyTasks: async () => [
157
+ {
158
+ nodeId: "node-1",
159
+ taskName: "实现接口",
160
+ nodeStatus: "PENDING",
161
+ },
162
+ {
163
+ nodeId: "node-2",
164
+ taskName: "整理结果",
165
+ nodeStatus: "PROCESSING",
166
+ },
167
+ ],
168
+ });
169
+ const handleToolCall = Reflect.get(server, "handleToolCall");
170
+ const result = (await handleToolCall.call(server, "get_message", {}));
171
+ assert.equal(result.directMessages.length, 1);
172
+ assert.match(result.directMessages[0].msgId, /^task-notify-/);
173
+ assert.equal(result.directMessages[0].senderId, "MCP-System");
174
+ assert.equal(result.directMessages[0].receiverId, "agent-self");
175
+ assert.match(result.directMessages[0].content, /实现接口/);
176
+ assert.match(result.directMessages[0].content, /整理结果/);
177
+ assert.match(result.directMessages[0].prompt ?? "", /自动生成,无需持久化/);
178
+ assert.deepEqual(result.groupMessages, []);
179
+ assert.equal(result.fromBuffer, false);
180
+ });
181
+ it("poll_message should return immediately with task notification when active tasks exist", async () => {
182
+ const server = createServerWithUnread({
183
+ directMessages: [],
184
+ groupMessages: [],
185
+ }, {
186
+ getMyTasks: async () => [
187
+ {
188
+ nodeId: "node-3",
189
+ taskName: "处理流程任务",
190
+ nodeStatus: "PENDING",
191
+ },
192
+ ],
193
+ });
194
+ const handleToolCall = Reflect.get(server, "handleToolCall");
195
+ const result = (await handleToolCall.call(server, "poll_message", {}));
196
+ assert.equal(result.directMessages.length, 1);
197
+ assert.match(result.directMessages[0].msgId, /^task-notify-/);
198
+ assert.equal(result.directMessages[0].senderId, "MCP-System");
199
+ assert.match(result.directMessages[0].content, /处理流程任务/);
200
+ assert.deepEqual(result.groupMessages, []);
201
+ assert.equal(result.fromBuffer, true);
202
+ });
203
+ });
204
+ describe("McpServer group discovery tool", () => {
205
+ it("get_group_rooms should proxy discoverable groups from agent client", async () => {
206
+ const server = new McpServer();
207
+ Reflect.set(server, "agentClient", {
208
+ discoverGroupRooms: async () => ({
209
+ groups: [
210
+ {
211
+ id: "project:demo",
212
+ projectName: "demo",
213
+ roomType: "project",
214
+ scopeRefId: "demo",
215
+ name: "demo 公共群聊",
216
+ memberUserIds: ["agent-1"],
217
+ },
218
+ {
219
+ id: "inner_group:g-1",
220
+ projectName: "demo",
221
+ roomType: "inner_group",
222
+ scopeRefId: "g-1",
223
+ name: "后端小组",
224
+ memberUserIds: ["agent-1", "agent-2"],
225
+ },
226
+ ],
227
+ }),
228
+ getStatusReporter: () => null,
229
+ });
230
+ const handleToolCall = Reflect.get(server, "handleToolCall");
231
+ const result = await handleToolCall.call(server, "get_group_rooms", {});
232
+ assert.deepEqual(result, {
233
+ groups: [
234
+ {
235
+ id: "project:demo",
236
+ projectName: "demo",
237
+ roomType: "project",
238
+ scopeRefId: "demo",
239
+ name: "demo 公共群聊",
240
+ memberUserIds: ["agent-1"],
241
+ },
242
+ {
243
+ id: "inner_group:g-1",
244
+ projectName: "demo",
245
+ roomType: "inner_group",
246
+ scopeRefId: "g-1",
247
+ name: "后端小组",
248
+ memberUserIds: ["agent-1", "agent-2"],
249
+ },
250
+ ],
251
+ });
252
+ });
253
+ it("send_group should forward roomId to agent client", async () => {
254
+ const server = new McpServer();
255
+ let capturedArgs = null;
256
+ Reflect.set(server, "agentClient", {
257
+ sendGroupMessage: async (content, projectName, roomId) => {
258
+ capturedArgs = { content, projectName, roomId };
259
+ return {
260
+ msgId: 1,
261
+ timestamp: new Date().toISOString(),
262
+ };
263
+ },
264
+ getStatusReporter: () => null,
265
+ });
266
+ const handleToolCall = Reflect.get(server, "handleToolCall");
267
+ await handleToolCall.call(server, "send_group", {
268
+ content: "hello room",
269
+ projectName: "demo",
270
+ roomId: "inner_group:g-1",
271
+ });
272
+ assert.deepEqual(capturedArgs, {
273
+ content: "hello room",
274
+ projectName: "demo",
275
+ roomId: "inner_group:g-1",
276
+ });
277
+ });
278
+ it("hire_colleague should forward role creation payload to agent client", async () => {
279
+ const server = new McpServer();
280
+ let capturedArgs = null;
281
+ const hiredResult = {
282
+ id: "agent-new",
283
+ displayName: "后端开发同事-AB12",
284
+ roleName: "后端开发同事",
285
+ projectName: "demo",
286
+ workspacePath: "D:/workspace/demo",
287
+ runtimeBridgeBaseUrl: "http://127.0.0.1:18081",
288
+ runtimeStatus: "stopped",
289
+ };
290
+ Reflect.set(server, "agentClient", {
291
+ hireColleague: async (args) => {
292
+ capturedArgs = args;
293
+ return hiredResult;
294
+ },
295
+ getStatusReporter: () => null,
296
+ });
297
+ const handleToolCall = Reflect.get(server, "handleToolCall");
298
+ const result = await handleToolCall.call(server, "hire_colleague", {
299
+ projectName: "demo",
300
+ roleName: "后端开发同事",
301
+ displayName: "后端开发同事-AB12",
302
+ prompt: "负责后端接口开发",
303
+ workspacePath: "D:/workspace/demo",
304
+ runtimeSkillEnabled: true,
305
+ runtimeMcpEnabled: true,
306
+ });
307
+ assert.deepEqual(capturedArgs, {
308
+ projectName: "demo",
309
+ roleName: "后端开发同事",
310
+ displayName: "后端开发同事-AB12",
311
+ prompt: "负责后端接口开发",
312
+ workspacePath: "D:/workspace/demo",
313
+ runtimeSkillEnabled: true,
314
+ runtimeMcpEnabled: true,
315
+ });
316
+ assert.deepEqual(result, hiredResult);
317
+ });
318
+ it("hire_colleague should validate required workspacePath", async () => {
319
+ const server = new McpServer();
320
+ const handleToolCall = Reflect.get(server, "handleToolCall");
321
+ await assert.rejects(async () => {
322
+ await handleToolCall.call(server, "hire_colleague", {
323
+ roleName: "后端开发同事",
324
+ });
325
+ }, /workspacePath 参数是必需的/);
326
+ });
327
+ it("hire_colleagues_batch should forward batch payload to agent client", async () => {
328
+ const server = new McpServer();
329
+ let capturedArgs = null;
330
+ const batchResult = {
331
+ batchId: "hire-batch-001",
332
+ projectName: "demo",
333
+ summary: {
334
+ total: 2,
335
+ approved: 1,
336
+ rejected: 1,
337
+ created: 1,
338
+ failed: 0,
339
+ },
340
+ results: [
341
+ {
342
+ itemId: "item-1",
343
+ decision: "APPROVED",
344
+ status: "CREATED",
345
+ createdAgent: {
346
+ id: "agent-new",
347
+ displayName: "后端开发同事-AB12",
348
+ roleName: "后端开发同事",
349
+ },
350
+ },
351
+ {
352
+ itemId: "item-2",
353
+ decision: "REJECTED",
354
+ status: "REJECTED",
355
+ reason: "当前阶段暂不需要",
356
+ },
357
+ ],
358
+ };
359
+ Reflect.set(server, "agentClient", {
360
+ hireColleaguesBatch: async (args) => {
361
+ capturedArgs = args;
362
+ return batchResult;
363
+ },
364
+ getStatusReporter: () => null,
365
+ });
366
+ const handleToolCall = Reflect.get(server, "handleToolCall");
367
+ const result = await handleToolCall.call(server, "hire_colleagues_batch", {
368
+ projectName: "demo",
369
+ items: [
370
+ {
371
+ roleName: "后端开发同事",
372
+ displayName: "后端开发同事-AB12",
373
+ prompt: "负责后端接口开发",
374
+ workspacePath: "D:/workspace/demo/backend",
375
+ },
376
+ {
377
+ newRoleName: "测试开发同事",
378
+ displayName: "测试开发同事-CD34",
379
+ prompt: "负责接口测试",
380
+ workspacePath: "D:/workspace/demo/test",
381
+ },
382
+ ],
383
+ });
384
+ assert.deepEqual(capturedArgs, {
385
+ projectName: "demo",
386
+ items: [
387
+ {
388
+ roleName: "后端开发同事",
389
+ displayName: "后端开发同事-AB12",
390
+ prompt: "负责后端接口开发",
391
+ workspacePath: "D:/workspace/demo/backend",
392
+ },
393
+ {
394
+ newRoleName: "测试开发同事",
395
+ displayName: "测试开发同事-CD34",
396
+ prompt: "负责接口测试",
397
+ workspacePath: "D:/workspace/demo/test",
398
+ },
399
+ ],
400
+ });
401
+ assert.deepEqual(result, batchResult);
402
+ });
403
+ it("hire_colleagues_batch should validate required items", async () => {
404
+ const server = new McpServer();
405
+ const handleToolCall = Reflect.get(server, "handleToolCall");
406
+ await assert.rejects(async () => {
407
+ await handleToolCall.call(server, "hire_colleagues_batch", {
408
+ projectName: "demo",
409
+ items: [],
410
+ });
411
+ }, /items 参数是必需的/);
412
+ });
413
+ it("hire_colleagues_batch should validate every item workspacePath", async () => {
414
+ const server = new McpServer();
415
+ const handleToolCall = Reflect.get(server, "handleToolCall");
416
+ await assert.rejects(async () => {
417
+ await handleToolCall.call(server, "hire_colleagues_batch", {
418
+ projectName: "demo",
419
+ items: [
420
+ {
421
+ roleName: "后端开发同事",
422
+ workspacePath: "D:/workspace/demo/backend",
423
+ },
424
+ {
425
+ roleName: "测试开发同事",
426
+ },
427
+ ],
428
+ });
429
+ }, /items\[1\].workspacePath 参数是必需的/);
430
+ });
431
+ });
432
+ describe("McpServer incoming group message filtering", () => {
433
+ it("should ignore self-sent group messages pushed from websocket events", async () => {
434
+ const server = new McpServer();
435
+ Reflect.set(server, "messageBuffer", new MessageBuffer());
436
+ Reflect.set(server, "agentClient", {
437
+ getState: () => ({
438
+ agentId: "agent-self",
439
+ displayName: "Self Agent",
440
+ isConnected: true,
441
+ isRegistered: true,
442
+ }),
443
+ getStatusReporter: () => null,
444
+ });
445
+ const selfGroupMessage = {
446
+ msgId: 501,
447
+ senderId: "agent-self",
448
+ senderName: "Self Agent",
449
+ content: "loopback group message",
450
+ timestamp: new Date().toISOString(),
451
+ projectName: "demo",
452
+ roomId: "project:demo",
453
+ };
454
+ const handleIncomingMessage = Reflect.get(server, "handleIncomingMessage");
455
+ await handleIncomingMessage.call(server, selfGroupMessage);
456
+ const messageBuffer = Reflect.get(server, "messageBuffer");
457
+ const drained = messageBuffer.get();
458
+ assert.deepEqual(drained, {
459
+ directMessages: [],
460
+ groupMessages: [],
461
+ });
462
+ });
463
+ });
464
+ describe("AgentClient group room aggregation", () => {
465
+ it("fetchUnreadMessages should aggregate unread messages from all discoverable rooms", async () => {
466
+ const client = new AgentClient();
467
+ Reflect.set(client, "agentId", "agent-1");
468
+ Reflect.set(client, "projectName", "demo");
469
+ const calls = [];
470
+ Reflect.set(client, "httpClient", {
471
+ callTool: async (toolName, args) => {
472
+ calls.push({ toolName, args });
473
+ if (toolName === "get_dm_messages") {
474
+ return { messages: [] };
475
+ }
476
+ if (toolName === "discover_group_rooms") {
477
+ return {
478
+ groups: [
479
+ {
480
+ id: "project:demo",
481
+ projectName: "demo",
482
+ roomType: "project",
483
+ scopeRefId: "demo",
484
+ name: "demo 公共群聊",
485
+ memberUserIds: ["agent-1"],
486
+ },
487
+ {
488
+ id: "inner_group:g-1",
489
+ projectName: "demo",
490
+ roomType: "inner_group",
491
+ scopeRefId: "g-1",
492
+ name: "后端小组",
493
+ memberUserIds: ["agent-1", "agent-2"],
494
+ },
495
+ ],
496
+ };
497
+ }
498
+ if (toolName === "get_group_messages") {
499
+ if (args.roomId === "project:demo") {
500
+ return {
501
+ messages: [
502
+ {
503
+ msgId: 1,
504
+ senderId: "agent-a",
505
+ senderName: "Agent A",
506
+ projectName: "demo",
507
+ roomId: "project:demo",
508
+ content: "project message",
509
+ timestamp: new Date().toISOString(),
510
+ },
511
+ ],
512
+ currentReadPos: 1,
513
+ hasMore: false,
514
+ };
515
+ }
516
+ if (args.roomId === "inner_group:g-1") {
517
+ return {
518
+ messages: [
519
+ {
520
+ msgId: 2,
521
+ senderId: "agent-b",
522
+ senderName: "Agent B",
523
+ projectName: "demo",
524
+ roomId: "inner_group:g-1",
525
+ content: "inner group message",
526
+ timestamp: new Date().toISOString(),
527
+ },
528
+ ],
529
+ currentReadPos: 2,
530
+ hasMore: false,
531
+ };
532
+ }
533
+ }
534
+ throw new Error(`unexpected tool call: ${toolName}`);
535
+ },
536
+ });
537
+ const result = await client.fetchUnreadMessages();
538
+ assert.equal(result.directMessages.length, 0);
539
+ assert.deepEqual(result.groupMessages.map((message) => ({
540
+ roomId: message.roomId,
541
+ content: message.content,
542
+ })), [
543
+ { roomId: "project:demo", content: "project message" },
544
+ { roomId: "inner_group:g-1", content: "inner group message" },
545
+ ]);
546
+ assert.equal(calls.filter((call) => call.toolName === "get_group_messages").length, 2);
547
+ });
548
+ it("getGroupHistory should aggregate history from all discoverable rooms when roomId is omitted", async () => {
549
+ const client = new AgentClient();
550
+ Reflect.set(client, "agentId", "agent-1");
551
+ Reflect.set(client, "projectName", "demo");
552
+ Reflect.set(client, "httpClient", {
553
+ callTool: async (toolName, args) => {
554
+ if (toolName === "discover_group_rooms") {
555
+ return {
556
+ groups: [
557
+ {
558
+ id: "project:demo",
559
+ projectName: "demo",
560
+ roomType: "project",
561
+ scopeRefId: "demo",
562
+ name: "demo 公共群聊",
563
+ memberUserIds: ["agent-1"],
564
+ },
565
+ {
566
+ id: "inner_group:g-1",
567
+ projectName: "demo",
568
+ roomType: "inner_group",
569
+ scopeRefId: "g-1",
570
+ name: "后端小组",
571
+ memberUserIds: ["agent-1", "agent-2"],
572
+ },
573
+ ],
574
+ };
575
+ }
576
+ if (toolName === "get_group_history") {
577
+ if (args.roomId === "project:demo") {
578
+ return {
579
+ messages: [
580
+ {
581
+ msgId: 1,
582
+ senderId: "agent-a",
583
+ senderName: "Agent A",
584
+ projectName: "demo",
585
+ roomId: "project:demo",
586
+ content: "project history",
587
+ timestamp: "2026-03-25T10:00:00.000Z",
588
+ },
589
+ ],
590
+ count: 1,
591
+ };
592
+ }
593
+ if (args.roomId === "inner_group:g-1") {
594
+ return {
595
+ messages: [
596
+ {
597
+ msgId: 2,
598
+ senderId: "agent-b",
599
+ senderName: "Agent B",
600
+ projectName: "demo",
601
+ roomId: "inner_group:g-1",
602
+ content: "group history",
603
+ timestamp: "2026-03-25T11:00:00.000Z",
604
+ },
605
+ ],
606
+ count: 1,
607
+ };
608
+ }
609
+ }
610
+ throw new Error(`unexpected tool call: ${toolName}`);
611
+ },
612
+ });
613
+ const result = await client.getGroupHistory(50);
614
+ assert.deepEqual(result.messages.map((message) => ({
615
+ roomId: message.roomId,
616
+ content: message.content,
617
+ })), [
618
+ { roomId: "project:demo", content: "project history" },
619
+ { roomId: "inner_group:g-1", content: "group history" },
620
+ ]);
621
+ assert.equal(result.count, 2);
622
+ });
623
+ });
624
+ //# sourceMappingURL=mcp-server.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.test.js","sourceRoot":"","sources":["../src/mcp-server.test.ts"],"names":[],"mappings":"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"}