@teneo-protocol/sdk 1.0.1 → 2.0.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/.github/workflows/publish-npm.yml +8 -6
- package/CHANGELOG.md +265 -0
- package/README.md +406 -53
- package/dist/core/websocket-client.d.ts +12 -0
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +22 -2
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +70 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +904 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js +51 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.js +65 -5
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.js +46 -4
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.d.ts +5 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.js +23 -1
- package/dist/handlers/message-handlers/index.js.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +877 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js +38 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +886 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js +51 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +178 -89
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js +92 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/types.d.ts +2 -0
- package/dist/handlers/message-handlers/types.d.ts.map +1 -1
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
- package/dist/managers/agent-room-manager.d.ts +222 -0
- package/dist/managers/agent-room-manager.d.ts.map +1 -0
- package/dist/managers/agent-room-manager.js +508 -0
- package/dist/managers/agent-room-manager.js.map +1 -0
- package/dist/managers/index.d.ts +2 -0
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js +5 -1
- package/dist/managers/index.js.map +1 -1
- package/dist/managers/room-management-manager.d.ts +213 -0
- package/dist/managers/room-management-manager.d.ts.map +1 -0
- package/dist/managers/room-management-manager.js +440 -0
- package/dist/managers/room-management-manager.js.map +1 -0
- package/dist/managers/room-manager.d.ts +4 -4
- package/dist/managers/room-manager.d.ts.map +1 -1
- package/dist/managers/room-manager.js.map +1 -1
- package/dist/teneo-sdk.d.ts +333 -13
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +468 -1
- package/dist/teneo-sdk.js.map +1 -1
- package/dist/types/config.d.ts +63 -54
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +8 -4
- package/dist/types/config.js.map +1 -1
- package/dist/types/error-codes.d.ts +2 -0
- package/dist/types/error-codes.d.ts.map +1 -1
- package/dist/types/error-codes.js +3 -0
- package/dist/types/error-codes.js.map +1 -1
- package/dist/types/events.d.ts +132 -68
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +27 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +11396 -2559
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +294 -27
- package/dist/types/messages.js.map +1 -1
- package/examples/.env.example +1 -1
- package/examples/agent-room-management-example.ts +334 -0
- package/examples/claude-agent-x-follower/.env.example +2 -2
- package/examples/claude-agent-x-follower/QUICKSTART.md +1 -1
- package/examples/claude-agent-x-follower/README.md +1 -1
- package/examples/n8n-teneo/.env.example +2 -2
- package/examples/n8n-teneo/README.md +1 -1
- package/examples/openai-teneo/.env.example +2 -2
- package/examples/openai-teneo/README.md +1 -1
- package/examples/production-dashboard/.env.example +2 -2
- package/examples/production-dashboard/README.md +89 -12
- package/examples/production-dashboard/public/dashboard.html +1173 -601
- package/examples/production-dashboard/server.ts +347 -5
- package/examples/room-management-example.ts +285 -0
- package/examples/usage/.env.example +1 -1
- package/examples/usage/01-connect.ts +1 -1
- package/examples/usage/02-list-agents.ts +1 -1
- package/examples/usage/03-pick-agent.ts +1 -1
- package/examples/usage/04-find-by-capability.ts +1 -1
- package/examples/usage/05-webhook-example.ts +1 -1
- package/examples/usage/06-simple-api-server.ts +1 -1
- package/examples/usage/07-event-listener.ts +1 -1
- package/examples/usage/README.md +1 -1
- package/package.json +9 -1
- package/src/core/websocket-client.ts +26 -2
- package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +83 -0
- package/src/handlers/message-handlers/agent-status-update-handler.ts +58 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +73 -5
- package/src/handlers/message-handlers/auth-success-handler.ts +58 -6
- package/src/handlers/message-handlers/index.ts +19 -0
- package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
- package/src/handlers/message-handlers/list-room-agents-handler.ts +61 -0
- package/src/handlers/message-handlers/room-operation-response-handler.ts +105 -0
- package/src/handlers/message-handlers/types.ts +6 -0
- package/src/managers/agent-room-manager.ts +609 -0
- package/src/managers/index.ts +2 -0
- package/src/managers/room-management-manager.ts +523 -0
- package/src/managers/room-manager.ts +4 -5
- package/src/teneo-sdk.ts +505 -4
- package/src/types/config.ts +10 -5
- package/src/types/error-codes.ts +4 -0
- package/src/types/events.ts +24 -0
- package/src/types/index.ts +55 -0
- package/src/types/messages.ts +374 -41
- package/tests/integration/room-management.test.ts +514 -0
- package/tests/integration/websocket.test.ts +1 -1
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +394 -0
- package/tests/unit/handlers/agent-status-update-handler.test.ts +407 -0
- package/tests/unit/handlers/auth-success-handler-rooms.test.ts +699 -0
- package/tests/unit/handlers/list-available-agents-handler.test.ts +256 -0
- package/tests/unit/handlers/list-room-agents-handler.test.ts +294 -0
- package/tests/unit/handlers/room-operation-response-handler.test.ts +527 -0
- package/tests/unit/managers/agent-room-manager.test.ts +534 -0
- package/tests/unit/managers/room-management-manager.test.ts +438 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for AgentRoomOperationResponseHandler
|
|
3
|
+
* Tests response handling for agent-room add/remove operations
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
7
|
+
import { AgentRoomOperationResponseHandler } from "../../../src/handlers/message-handlers/agent-room-operation-response-handler";
|
|
8
|
+
import { HandlerContext } from "../../../src/handlers/message-handlers/types";
|
|
9
|
+
import { Logger } from "../../../src/types";
|
|
10
|
+
import { SDKError } from "../../../src/types/events";
|
|
11
|
+
import { ErrorCode } from "../../../src/types/error-codes";
|
|
12
|
+
|
|
13
|
+
describe("AgentRoomOperationResponseHandler", () => {
|
|
14
|
+
let handler: AgentRoomOperationResponseHandler;
|
|
15
|
+
let mockContext: HandlerContext;
|
|
16
|
+
let mockLogger: Logger;
|
|
17
|
+
let emitSpy: ReturnType<typeof vi.fn>;
|
|
18
|
+
let sendWebhookSpy: ReturnType<typeof vi.fn>;
|
|
19
|
+
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
// Create mock logger
|
|
22
|
+
mockLogger = {
|
|
23
|
+
debug: vi.fn(),
|
|
24
|
+
info: vi.fn(),
|
|
25
|
+
warn: vi.fn(),
|
|
26
|
+
error: vi.fn()
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// Create spies
|
|
30
|
+
emitSpy = vi.fn();
|
|
31
|
+
sendWebhookSpy = vi.fn().mockResolvedValue(undefined);
|
|
32
|
+
|
|
33
|
+
// Create mock context
|
|
34
|
+
mockContext = {
|
|
35
|
+
emit: emitSpy,
|
|
36
|
+
sendWebhook: sendWebhookSpy,
|
|
37
|
+
logger: mockLogger,
|
|
38
|
+
getConnectionState: vi.fn(),
|
|
39
|
+
getAuthState: vi.fn(),
|
|
40
|
+
updateConnectionState: vi.fn(),
|
|
41
|
+
updateAuthState: vi.fn(),
|
|
42
|
+
sendMessage: vi.fn()
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Create handler instance
|
|
46
|
+
handler = new AgentRoomOperationResponseHandler();
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
describe("Handler Metadata", () => {
|
|
50
|
+
it("should have correct type", () => {
|
|
51
|
+
expect(handler.type).toBe("agent_room_operation_response");
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("should have schema defined", () => {
|
|
55
|
+
expect(handler.schema).toBeDefined();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("should identify messages it can handle", () => {
|
|
59
|
+
const message = { type: "agent_room_operation_response", data: {} };
|
|
60
|
+
expect(handler.canHandle(message as any)).toBe(true);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("should not handle other message types", () => {
|
|
64
|
+
const message = { type: "other_type", data: {} };
|
|
65
|
+
expect(handler.canHandle(message as any)).toBe(false);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
describe("Success Responses", () => {
|
|
70
|
+
it("should handle successful agent add", async () => {
|
|
71
|
+
const message = {
|
|
72
|
+
type: "agent_room_operation_response" as const,
|
|
73
|
+
data: {
|
|
74
|
+
success: true,
|
|
75
|
+
room_id: "room-123",
|
|
76
|
+
agent_id: "agent-456"
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
await handler.handle(message, mockContext);
|
|
81
|
+
|
|
82
|
+
// Should emit both add and remove events (listeners filter by room/agent ID)
|
|
83
|
+
expect(emitSpy).toHaveBeenCalledWith("agent_room:agent_added", "room-123", "agent-456");
|
|
84
|
+
expect(emitSpy).toHaveBeenCalledWith("agent_room:agent_removed", "room-123", "agent-456");
|
|
85
|
+
|
|
86
|
+
// Should send webhook
|
|
87
|
+
expect(sendWebhookSpy).toHaveBeenCalledWith(
|
|
88
|
+
"agent_room_operation",
|
|
89
|
+
expect.objectContaining({
|
|
90
|
+
success: true,
|
|
91
|
+
room_id: "room-123",
|
|
92
|
+
agent_id: "agent-456"
|
|
93
|
+
}),
|
|
94
|
+
undefined
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
// Should log
|
|
98
|
+
expect(mockLogger.info).toHaveBeenCalledWith(
|
|
99
|
+
"Agent room operation succeeded",
|
|
100
|
+
expect.objectContaining({
|
|
101
|
+
roomId: "room-123",
|
|
102
|
+
agentId: "agent-456"
|
|
103
|
+
})
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("should handle successful agent remove", async () => {
|
|
108
|
+
const message = {
|
|
109
|
+
type: "agent_room_operation_response" as const,
|
|
110
|
+
data: {
|
|
111
|
+
success: true,
|
|
112
|
+
room_id: "room-789",
|
|
113
|
+
agent_id: "agent-999"
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
await handler.handle(message, mockContext);
|
|
118
|
+
|
|
119
|
+
expect(emitSpy).toHaveBeenCalledWith("agent_room:agent_added", "room-789", "agent-999");
|
|
120
|
+
expect(emitSpy).toHaveBeenCalledWith("agent_room:agent_removed", "room-789", "agent-999");
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("should handle success without agent_id", async () => {
|
|
124
|
+
const message = {
|
|
125
|
+
type: "agent_room_operation_response" as const,
|
|
126
|
+
data: {
|
|
127
|
+
success: true,
|
|
128
|
+
room_id: "room-123"
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
await handler.handle(message, mockContext);
|
|
133
|
+
|
|
134
|
+
// Should log warning and not emit success events
|
|
135
|
+
expect(mockLogger.warn).toHaveBeenCalledWith(
|
|
136
|
+
"Agent room operation succeeded but missing room_id or agent_id"
|
|
137
|
+
);
|
|
138
|
+
expect(emitSpy).not.toHaveBeenCalledWith("agent_room:agent_added", expect.anything(), expect.anything());
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it("should handle success without room_id", async () => {
|
|
142
|
+
const message = {
|
|
143
|
+
type: "agent_room_operation_response" as const,
|
|
144
|
+
data: {
|
|
145
|
+
success: true,
|
|
146
|
+
agent_id: "agent-456"
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
await handler.handle(message, mockContext);
|
|
151
|
+
|
|
152
|
+
// Should log warning and not emit success events
|
|
153
|
+
expect(mockLogger.warn).toHaveBeenCalledWith(
|
|
154
|
+
"Agent room operation succeeded but missing room_id or agent_id"
|
|
155
|
+
);
|
|
156
|
+
expect(emitSpy).not.toHaveBeenCalledWith("agent_room:agent_added", expect.anything(), expect.anything());
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
describe("Error Responses", () => {
|
|
161
|
+
it("should handle error response with message", async () => {
|
|
162
|
+
const errorMessage = "Agent already in room";
|
|
163
|
+
const roomId = "room-123";
|
|
164
|
+
const agentId = "agent-456";
|
|
165
|
+
|
|
166
|
+
const message = {
|
|
167
|
+
type: "agent_room_operation_response" as const,
|
|
168
|
+
data: {
|
|
169
|
+
success: false,
|
|
170
|
+
message: errorMessage,
|
|
171
|
+
room_id: roomId,
|
|
172
|
+
agent_id: agentId
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
await handler.handle(message, mockContext);
|
|
177
|
+
|
|
178
|
+
// Should emit both add and remove error events
|
|
179
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
180
|
+
"agent_room:add_error",
|
|
181
|
+
expect.any(SDKError),
|
|
182
|
+
roomId
|
|
183
|
+
);
|
|
184
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
185
|
+
"agent_room:remove_error",
|
|
186
|
+
expect.any(SDKError),
|
|
187
|
+
roomId
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
// Verify error details
|
|
191
|
+
const addErrorCall = emitSpy.mock.calls.find(
|
|
192
|
+
(call) => call[0] === "agent_room:add_error"
|
|
193
|
+
);
|
|
194
|
+
const error = addErrorCall[1] as SDKError;
|
|
195
|
+
expect(error.message).toBe(errorMessage);
|
|
196
|
+
expect(error.code).toBe(ErrorCode.OPERATION_FAILED);
|
|
197
|
+
|
|
198
|
+
// Should send webhook
|
|
199
|
+
expect(sendWebhookSpy).toHaveBeenCalledWith(
|
|
200
|
+
"agent_room_operation_error",
|
|
201
|
+
expect.objectContaining({
|
|
202
|
+
success: false,
|
|
203
|
+
message: errorMessage,
|
|
204
|
+
room_id: roomId,
|
|
205
|
+
agent_id: agentId
|
|
206
|
+
}),
|
|
207
|
+
undefined
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
// Should log
|
|
211
|
+
expect(mockLogger.error).toHaveBeenCalledWith(
|
|
212
|
+
"Agent room operation failed",
|
|
213
|
+
expect.objectContaining({
|
|
214
|
+
roomId,
|
|
215
|
+
agentId,
|
|
216
|
+
error: errorMessage
|
|
217
|
+
})
|
|
218
|
+
);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it("should handle error without message", async () => {
|
|
222
|
+
const message = {
|
|
223
|
+
type: "agent_room_operation_response" as const,
|
|
224
|
+
data: {
|
|
225
|
+
success: false,
|
|
226
|
+
room_id: "room-123"
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
await handler.handle(message, mockContext);
|
|
231
|
+
|
|
232
|
+
// Should use default error message
|
|
233
|
+
const addErrorCall = emitSpy.mock.calls.find(
|
|
234
|
+
(call) => call[0] === "agent_room:add_error"
|
|
235
|
+
);
|
|
236
|
+
const error = addErrorCall[1] as SDKError;
|
|
237
|
+
expect(error.message).toBe("Agent room operation failed");
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it("should handle error without room_id", async () => {
|
|
241
|
+
const message = {
|
|
242
|
+
type: "agent_room_operation_response" as const,
|
|
243
|
+
data: {
|
|
244
|
+
success: false,
|
|
245
|
+
message: "Generic error",
|
|
246
|
+
agent_id: "agent-456"
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
await handler.handle(message, mockContext);
|
|
251
|
+
|
|
252
|
+
// Should emit error events with undefined room_id
|
|
253
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
254
|
+
"agent_room:add_error",
|
|
255
|
+
expect.any(SDKError),
|
|
256
|
+
undefined
|
|
257
|
+
);
|
|
258
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
259
|
+
"agent_room:remove_error",
|
|
260
|
+
expect.any(SDKError),
|
|
261
|
+
undefined
|
|
262
|
+
);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it("should handle error without agent_id", async () => {
|
|
266
|
+
const message = {
|
|
267
|
+
type: "agent_room_operation_response" as const,
|
|
268
|
+
data: {
|
|
269
|
+
success: false,
|
|
270
|
+
message: "Room not found",
|
|
271
|
+
room_id: "room-123"
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
await handler.handle(message, mockContext);
|
|
276
|
+
|
|
277
|
+
// Should still emit error events
|
|
278
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
279
|
+
"agent_room:add_error",
|
|
280
|
+
expect.any(SDKError),
|
|
281
|
+
"room-123"
|
|
282
|
+
);
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
describe("Webhook Errors", () => {
|
|
287
|
+
it("should handle webhook failures gracefully", async () => {
|
|
288
|
+
const webhookError = new Error("Webhook failed");
|
|
289
|
+
sendWebhookSpy.mockRejectedValueOnce(webhookError);
|
|
290
|
+
|
|
291
|
+
const message = {
|
|
292
|
+
type: "agent_room_operation_response" as const,
|
|
293
|
+
data: {
|
|
294
|
+
success: true,
|
|
295
|
+
room_id: "room-123",
|
|
296
|
+
agent_id: "agent-456"
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
// Should not throw (webhook errors are logged but don't fail the handler)
|
|
301
|
+
await handler.handle(message, mockContext);
|
|
302
|
+
|
|
303
|
+
// Should still emit events
|
|
304
|
+
expect(emitSpy).toHaveBeenCalledWith("agent_room:agent_added", "room-123", "agent-456");
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
describe("Message Validation", () => {
|
|
309
|
+
it("should handle invalid message structure", async () => {
|
|
310
|
+
const invalidMessage = {
|
|
311
|
+
type: "agent_room_operation_response",
|
|
312
|
+
// Missing data field
|
|
313
|
+
} as any;
|
|
314
|
+
|
|
315
|
+
await handler.handle(invalidMessage, mockContext);
|
|
316
|
+
|
|
317
|
+
// Should log error
|
|
318
|
+
expect(mockLogger.error).toHaveBeenCalledWith(
|
|
319
|
+
expect.stringContaining("Error handling agent_room_operation_response"),
|
|
320
|
+
expect.any(Error)
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
// Should emit message:error event
|
|
324
|
+
expect(emitSpy).toHaveBeenCalledWith(
|
|
325
|
+
"message:error",
|
|
326
|
+
expect.any(Error),
|
|
327
|
+
invalidMessage
|
|
328
|
+
);
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it("should accept valid message with extra fields", async () => {
|
|
332
|
+
const message = {
|
|
333
|
+
type: "agent_room_operation_response" as const,
|
|
334
|
+
data: {
|
|
335
|
+
success: true,
|
|
336
|
+
room_id: "room-123",
|
|
337
|
+
agent_id: "agent-456",
|
|
338
|
+
extra_field: "should be ignored",
|
|
339
|
+
another_extra: 123
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
// Should not throw
|
|
344
|
+
await handler.handle(message, mockContext);
|
|
345
|
+
|
|
346
|
+
expect(emitSpy).toHaveBeenCalledWith("agent_room:agent_added", "room-123", "agent-456");
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
describe("Debug Logging", () => {
|
|
351
|
+
it("should log debug info for successful operation", async () => {
|
|
352
|
+
const message = {
|
|
353
|
+
type: "agent_room_operation_response" as const,
|
|
354
|
+
data: {
|
|
355
|
+
success: true,
|
|
356
|
+
room_id: "room-123",
|
|
357
|
+
agent_id: "agent-456"
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
await handler.handle(message, mockContext);
|
|
362
|
+
|
|
363
|
+
expect(mockLogger.debug).toHaveBeenCalledWith(
|
|
364
|
+
"Handling agent_room_operation_response",
|
|
365
|
+
expect.objectContaining({
|
|
366
|
+
success: true,
|
|
367
|
+
roomId: "room-123",
|
|
368
|
+
agentId: "agent-456"
|
|
369
|
+
})
|
|
370
|
+
);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
it("should log debug info for error operation", async () => {
|
|
374
|
+
const message = {
|
|
375
|
+
type: "agent_room_operation_response" as const,
|
|
376
|
+
data: {
|
|
377
|
+
success: false,
|
|
378
|
+
message: "Error occurred",
|
|
379
|
+
room_id: "room-123"
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
await handler.handle(message, mockContext);
|
|
384
|
+
|
|
385
|
+
expect(mockLogger.debug).toHaveBeenCalledWith(
|
|
386
|
+
"Handling agent_room_operation_response",
|
|
387
|
+
expect.objectContaining({
|
|
388
|
+
success: false,
|
|
389
|
+
roomId: "room-123"
|
|
390
|
+
})
|
|
391
|
+
);
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
});
|