agent-relay 3.1.1 → 3.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 (42) hide show
  1. package/package.json +8 -8
  2. package/packages/acp-bridge/package.json +2 -2
  3. package/packages/config/package.json +1 -1
  4. package/packages/hooks/package.json +4 -4
  5. package/packages/memory/package.json +2 -2
  6. package/packages/openclaw/dist/__tests__/gateway-control.test.d.ts +2 -0
  7. package/packages/openclaw/dist/__tests__/gateway-control.test.d.ts.map +1 -0
  8. package/packages/openclaw/dist/__tests__/gateway-control.test.js +250 -0
  9. package/packages/openclaw/dist/__tests__/gateway-control.test.js.map +1 -0
  10. package/packages/openclaw/dist/__tests__/gateway-threads.test.js +617 -0
  11. package/packages/openclaw/dist/__tests__/gateway-threads.test.js.map +1 -1
  12. package/packages/openclaw/dist/__tests__/spawn-manager.test.js +29 -0
  13. package/packages/openclaw/dist/__tests__/spawn-manager.test.js.map +1 -1
  14. package/packages/openclaw/dist/__tests__/ws-client.test.d.ts +2 -0
  15. package/packages/openclaw/dist/__tests__/ws-client.test.d.ts.map +1 -0
  16. package/packages/openclaw/dist/__tests__/ws-client.test.js +324 -0
  17. package/packages/openclaw/dist/__tests__/ws-client.test.js.map +1 -0
  18. package/packages/openclaw/dist/cli.js +1 -1
  19. package/packages/openclaw/dist/cli.js.map +1 -1
  20. package/packages/openclaw/dist/gateway.d.ts +33 -7
  21. package/packages/openclaw/dist/gateway.d.ts.map +1 -1
  22. package/packages/openclaw/dist/gateway.js +101 -50
  23. package/packages/openclaw/dist/gateway.js.map +1 -1
  24. package/packages/openclaw/dist/types.d.ts +5 -1
  25. package/packages/openclaw/dist/types.d.ts.map +1 -1
  26. package/packages/openclaw/package.json +2 -2
  27. package/packages/openclaw/skill/SKILL.md +35 -13
  28. package/packages/openclaw/src/__tests__/SPEC-ws-client-testing.md +192 -0
  29. package/packages/openclaw/src/__tests__/gateway-control.test.ts +288 -0
  30. package/packages/openclaw/src/__tests__/gateway-threads.test.ts +746 -0
  31. package/packages/openclaw/src/__tests__/spawn-manager.test.ts +37 -0
  32. package/packages/openclaw/src/__tests__/ws-client.test.ts +395 -0
  33. package/packages/openclaw/src/cli.ts +1 -1
  34. package/packages/openclaw/src/gateway.ts +129 -56
  35. package/packages/openclaw/src/types.ts +5 -1
  36. package/packages/policy/package.json +2 -2
  37. package/packages/sdk/package.json +2 -2
  38. package/packages/sdk-py/pyproject.toml +1 -1
  39. package/packages/telemetry/package.json +1 -1
  40. package/packages/trajectory/package.json +2 -2
  41. package/packages/user-directory/package.json +2 -2
  42. package/packages/utils/package.json +2 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "description": "Real-time agent-to-agent communication system",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -174,13 +174,13 @@
174
174
  },
175
175
  "homepage": "https://github.com/AgentWorkforce/relay#readme",
176
176
  "dependencies": {
177
- "@agent-relay/config": "3.1.1",
178
- "@agent-relay/hooks": "3.1.1",
179
- "@agent-relay/sdk": "3.1.1",
180
- "@agent-relay/telemetry": "3.1.1",
181
- "@agent-relay/trajectory": "3.1.1",
182
- "@agent-relay/user-directory": "3.1.1",
183
- "@agent-relay/utils": "3.1.1",
177
+ "@agent-relay/config": "3.1.2",
178
+ "@agent-relay/hooks": "3.1.2",
179
+ "@agent-relay/sdk": "3.1.2",
180
+ "@agent-relay/telemetry": "3.1.2",
181
+ "@agent-relay/trajectory": "3.1.2",
182
+ "@agent-relay/user-directory": "3.1.2",
183
+ "@agent-relay/utils": "3.1.2",
184
184
  "@modelcontextprotocol/sdk": "^1.0.0",
185
185
  "@relaycast/sdk": "^0.4.0",
186
186
  "chokidar": "^5.0.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/acp-bridge",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "description": "ACP (Agent Client Protocol) bridge for Agent Relay - expose relay agents to ACP-compatible editors like Zed",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -46,7 +46,7 @@
46
46
  "access": "public"
47
47
  },
48
48
  "dependencies": {
49
- "@agent-relay/sdk": "3.1.1",
49
+ "@agent-relay/sdk": "3.1.2",
50
50
  "@agentclientprotocol/sdk": "^0.12.0"
51
51
  },
52
52
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/config",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "description": "Shared configuration schemas and loaders for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/hooks",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "description": "Hook emitter, registry, and trajectory hooks for Agent Relay",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -37,9 +37,9 @@
37
37
  "test:watch": "vitest"
38
38
  },
39
39
  "dependencies": {
40
- "@agent-relay/config": "3.1.1",
41
- "@agent-relay/trajectory": "3.1.1",
42
- "@agent-relay/sdk": "3.1.1"
40
+ "@agent-relay/config": "3.1.2",
41
+ "@agent-relay/trajectory": "3.1.2",
42
+ "@agent-relay/sdk": "3.1.2"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^22.19.3",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/memory",
3
- "version": "3.1.1",
3
+ "version": "3.1.2",
4
4
  "description": "Semantic memory storage and retrieval system for agent-relay with multiple backend support",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "test:watch": "vitest"
23
23
  },
24
24
  "dependencies": {
25
- "@agent-relay/hooks": "3.1.1"
25
+ "@agent-relay/hooks": "3.1.2"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^22.19.3",
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gateway-control.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-control.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/gateway-control.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,250 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ // ---------------------------------------------------------------------------
3
+ // Mocks
4
+ // ---------------------------------------------------------------------------
5
+ const eventHandlers = {};
6
+ function registerHandler(event) {
7
+ return (handler) => {
8
+ if (!eventHandlers[event])
9
+ eventHandlers[event] = [];
10
+ eventHandlers[event].push(handler);
11
+ return () => {
12
+ eventHandlers[event] = eventHandlers[event].filter((h) => h !== handler);
13
+ };
14
+ };
15
+ }
16
+ const mockAgentClient = {
17
+ connect: vi.fn(),
18
+ disconnect: vi.fn().mockResolvedValue(undefined),
19
+ subscribe: vi.fn(),
20
+ channels: {
21
+ join: vi.fn().mockResolvedValue({ ok: true }),
22
+ create: vi.fn().mockResolvedValue({ name: 'general' }),
23
+ },
24
+ on: {
25
+ connected: registerHandler('connected'),
26
+ messageCreated: registerHandler('messageCreated'),
27
+ threadReply: registerHandler('threadReply'),
28
+ dmReceived: registerHandler('dmReceived'),
29
+ groupDmReceived: registerHandler('groupDmReceived'),
30
+ commandInvoked: registerHandler('commandInvoked'),
31
+ reactionAdded: registerHandler('reactionAdded'),
32
+ reactionRemoved: registerHandler('reactionRemoved'),
33
+ reconnecting: registerHandler('reconnecting'),
34
+ disconnected: registerHandler('disconnected'),
35
+ error: registerHandler('error'),
36
+ any: registerHandler('any'),
37
+ },
38
+ };
39
+ vi.mock('@relaycast/sdk', () => ({
40
+ RelayCast: vi.fn().mockImplementation(() => ({
41
+ agents: {
42
+ registerOrGet: vi.fn().mockResolvedValue({ name: 'viewer-test-claw', token: 'tok_test' }),
43
+ },
44
+ channels: { join: vi.fn().mockResolvedValue({ ok: true }) },
45
+ messages: { list: vi.fn().mockResolvedValue([]) },
46
+ as: vi.fn().mockReturnValue(mockAgentClient),
47
+ })),
48
+ }));
49
+ const mockSpawnManager = {
50
+ size: 0,
51
+ spawn: vi.fn(),
52
+ release: vi.fn(),
53
+ releaseByName: vi.fn(),
54
+ releaseAll: vi.fn().mockResolvedValue(undefined),
55
+ list: vi.fn().mockReturnValue([]),
56
+ get: vi.fn(),
57
+ };
58
+ vi.mock('../spawn/manager.js', () => ({
59
+ SpawnManager: vi.fn().mockImplementation(() => mockSpawnManager),
60
+ }));
61
+ vi.mock('node:fs/promises', () => ({
62
+ readFile: vi.fn().mockResolvedValue('{"spawns":[]}'),
63
+ writeFile: vi.fn().mockResolvedValue(undefined),
64
+ mkdir: vi.fn().mockResolvedValue(undefined),
65
+ }));
66
+ vi.mock('node:fs', () => ({
67
+ existsSync: vi.fn().mockReturnValue(false),
68
+ }));
69
+ // We do NOT mock node:http — we want a real HTTP server for these tests.
70
+ // But we need to intercept createServer in InboundGateway so we can control the port.
71
+ // Strategy: let gateway start its own server, then hit it via fetch().
72
+ // We need to override RELAYCAST_CONTROL_PORT to use port 0 (random)
73
+ // Actually, we can't use port 0 because the gateway hardcodes the listen call.
74
+ // Instead, let's mock node:http to capture the request handler, then run a real server.
75
+ let capturedHandler = null;
76
+ let realServer = null;
77
+ let controlPort = 0;
78
+ vi.mock('node:http', async (importOriginal) => {
79
+ const actual = await importOriginal();
80
+ return {
81
+ ...actual,
82
+ createServer: vi.fn((handler) => {
83
+ capturedHandler = handler;
84
+ // Create a real HTTP server with the captured handler
85
+ realServer = actual.createServer(handler);
86
+ return {
87
+ listen: vi.fn((_port, _host, cb) => {
88
+ // Bind to random port
89
+ realServer.listen(0, '127.0.0.1', () => {
90
+ const addr = realServer.address();
91
+ controlPort = addr.port;
92
+ cb();
93
+ });
94
+ }),
95
+ close: vi.fn((cb) => {
96
+ realServer?.close(() => cb?.());
97
+ }),
98
+ address: vi.fn(() => realServer?.address()),
99
+ on: vi.fn((_event, _handler) => { }),
100
+ };
101
+ }),
102
+ };
103
+ });
104
+ import { InboundGateway } from '../gateway.js';
105
+ // ---------------------------------------------------------------------------
106
+ // Helpers
107
+ // ---------------------------------------------------------------------------
108
+ async function fetchControl(method, path, body) {
109
+ const url = `http://127.0.0.1:${controlPort}${path}`;
110
+ const opts = { method };
111
+ if (body !== undefined) {
112
+ opts.body = JSON.stringify(body);
113
+ opts.headers = { 'Content-Type': 'application/json' };
114
+ }
115
+ return fetch(url, opts);
116
+ }
117
+ // ---------------------------------------------------------------------------
118
+ // Tests
119
+ // ---------------------------------------------------------------------------
120
+ describe('Gateway control HTTP server', () => {
121
+ let gateway;
122
+ beforeEach(async () => {
123
+ vi.clearAllMocks();
124
+ for (const key of Object.keys(eventHandlers)) {
125
+ eventHandlers[key] = [];
126
+ }
127
+ // Reset mock spawn manager state
128
+ mockSpawnManager.size = 0;
129
+ mockSpawnManager.spawn.mockReset();
130
+ mockSpawnManager.release.mockReset();
131
+ mockSpawnManager.releaseByName.mockReset();
132
+ mockSpawnManager.list.mockReturnValue([]);
133
+ gateway = new InboundGateway({
134
+ config: {
135
+ apiKey: 'rk_live_test',
136
+ clawName: 'test-claw',
137
+ baseUrl: 'https://api.relaycast.dev',
138
+ channels: ['general'],
139
+ },
140
+ relaySender: { sendMessage: vi.fn().mockResolvedValue({ event_id: 'evt_1' }) },
141
+ });
142
+ await gateway.start();
143
+ });
144
+ afterEach(async () => {
145
+ await gateway.stop();
146
+ if (realServer) {
147
+ realServer.close();
148
+ realServer = null;
149
+ }
150
+ });
151
+ it('GET /health returns 200', async () => {
152
+ const res = await fetchControl('GET', '/health');
153
+ expect(res.status).toBe(200);
154
+ const data = await res.json();
155
+ expect(data.ok).toBe(true);
156
+ expect(data.status).toBe('running');
157
+ expect(typeof data.uptime).toBe('number');
158
+ });
159
+ it('POST /spawn with name returns 200', async () => {
160
+ mockSpawnManager.spawn.mockResolvedValue({
161
+ id: 'spawn-1',
162
+ displayName: 'worker-1',
163
+ agentName: 'claw-ws-worker-1',
164
+ gatewayPort: 18800,
165
+ });
166
+ mockSpawnManager.size = 1;
167
+ const res = await fetchControl('POST', '/spawn', {
168
+ name: 'worker-1',
169
+ role: 'researcher',
170
+ });
171
+ expect(res.status).toBe(200);
172
+ const data = await res.json();
173
+ expect(data.ok).toBe(true);
174
+ expect(data.name).toBe('worker-1');
175
+ expect(data.agentName).toBe('claw-ws-worker-1');
176
+ expect(data.id).toBe('spawn-1');
177
+ });
178
+ it('POST /spawn without name returns 400', async () => {
179
+ const res = await fetchControl('POST', '/spawn', { role: 'worker' });
180
+ expect(res.status).toBe(400);
181
+ const data = await res.json();
182
+ expect(data.ok).toBe(false);
183
+ expect(data.error).toMatch(/name/i);
184
+ });
185
+ it('POST /spawn error returns 500', async () => {
186
+ mockSpawnManager.spawn.mockRejectedValue(new Error('Docker unavailable'));
187
+ const res = await fetchControl('POST', '/spawn', { name: 'worker-1' });
188
+ expect(res.status).toBe(500);
189
+ const data = await res.json();
190
+ expect(data.ok).toBe(false);
191
+ expect(data.error).toContain('Docker unavailable');
192
+ });
193
+ it('GET /list returns 200 with empty list', async () => {
194
+ mockSpawnManager.list.mockReturnValue([]);
195
+ const res = await fetchControl('GET', '/list');
196
+ expect(res.status).toBe(200);
197
+ const data = await res.json();
198
+ expect(data.ok).toBe(true);
199
+ expect(data.active).toBe(0);
200
+ expect(data.claws).toEqual([]);
201
+ });
202
+ it('GET /list returns handles', async () => {
203
+ mockSpawnManager.list.mockReturnValue([
204
+ { id: 's1', displayName: 'alpha', agentName: 'claw-alpha', gatewayPort: 18801 },
205
+ ]);
206
+ const res = await fetchControl('GET', '/list');
207
+ expect(res.status).toBe(200);
208
+ const data = await res.json();
209
+ expect(data.claws).toHaveLength(1);
210
+ expect(data.claws[0].name).toBe('alpha');
211
+ });
212
+ it('POST /release by name returns 200', async () => {
213
+ mockSpawnManager.releaseByName.mockResolvedValue(true);
214
+ mockSpawnManager.size = 0;
215
+ const res = await fetchControl('POST', '/release', { name: 'worker-1' });
216
+ expect(res.status).toBe(200);
217
+ const data = await res.json();
218
+ expect(data.ok).toBe(true);
219
+ });
220
+ it('POST /release by id returns 200', async () => {
221
+ mockSpawnManager.release.mockResolvedValue(true);
222
+ mockSpawnManager.size = 0;
223
+ const res = await fetchControl('POST', '/release', { id: 'spawn-1' });
224
+ expect(res.status).toBe(200);
225
+ const data = await res.json();
226
+ expect(data.ok).toBe(true);
227
+ });
228
+ it('POST /release without name or id returns 400', async () => {
229
+ const res = await fetchControl('POST', '/release', {});
230
+ expect(res.status).toBe(400);
231
+ const data = await res.json();
232
+ expect(data.ok).toBe(false);
233
+ expect(data.error).toMatch(/name.*id|id.*name/i);
234
+ });
235
+ it('POST /release error returns 500', async () => {
236
+ mockSpawnManager.release.mockRejectedValue(new Error('Process kill failed'));
237
+ const res = await fetchControl('POST', '/release', { id: 'spawn-1' });
238
+ expect(res.status).toBe(500);
239
+ const data = await res.json();
240
+ expect(data.ok).toBe(false);
241
+ expect(data.error).toContain('Process kill failed');
242
+ });
243
+ it('GET /unknown returns 404', async () => {
244
+ const res = await fetchControl('GET', '/nonexistent');
245
+ expect(res.status).toBe(404);
246
+ const data = await res.json();
247
+ expect(data.error).toBe('Not found');
248
+ });
249
+ });
250
+ //# sourceMappingURL=gateway-control.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-control.test.js","sourceRoot":"","sources":["../../src/__tests__/gateway-control.test.ts"],"names":[],"mappings":"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"}