@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.
Files changed (153) hide show
  1. package/.github/workflows/publish-npm.yml +8 -6
  2. package/CHANGELOG.md +265 -0
  3. package/README.md +406 -53
  4. package/dist/core/websocket-client.d.ts +12 -0
  5. package/dist/core/websocket-client.d.ts.map +1 -1
  6. package/dist/core/websocket-client.js +22 -2
  7. package/dist/core/websocket-client.js.map +1 -1
  8. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
  9. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
  10. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +70 -0
  11. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
  12. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
  13. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  14. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +904 -0
  15. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
  16. package/dist/handlers/message-handlers/agent-status-update-handler.js +51 -0
  17. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
  18. package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
  19. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  20. package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
  21. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  22. package/dist/handlers/message-handlers/auth-message-handler.js +65 -5
  23. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  24. package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
  25. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  26. package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
  27. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  28. package/dist/handlers/message-handlers/auth-success-handler.js +46 -4
  29. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  30. package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
  31. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  32. package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
  33. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  34. package/dist/handlers/message-handlers/index.d.ts +5 -0
  35. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  36. package/dist/handlers/message-handlers/index.js +23 -1
  37. package/dist/handlers/message-handlers/index.js.map +1 -1
  38. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +877 -0
  39. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
  40. package/dist/handlers/message-handlers/list-available-agents-handler.js +38 -0
  41. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
  42. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +886 -0
  43. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
  44. package/dist/handlers/message-handlers/list-room-agents-handler.js +51 -0
  45. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
  46. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +178 -89
  47. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  48. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
  49. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  50. package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
  51. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  52. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
  53. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
  54. package/dist/handlers/message-handlers/room-operation-response-handler.js +92 -0
  55. package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
  56. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
  57. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  58. package/dist/handlers/message-handlers/types.d.ts +2 -0
  59. package/dist/handlers/message-handlers/types.d.ts.map +1 -1
  60. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
  61. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  62. package/dist/managers/agent-room-manager.d.ts +222 -0
  63. package/dist/managers/agent-room-manager.d.ts.map +1 -0
  64. package/dist/managers/agent-room-manager.js +508 -0
  65. package/dist/managers/agent-room-manager.js.map +1 -0
  66. package/dist/managers/index.d.ts +2 -0
  67. package/dist/managers/index.d.ts.map +1 -1
  68. package/dist/managers/index.js +5 -1
  69. package/dist/managers/index.js.map +1 -1
  70. package/dist/managers/room-management-manager.d.ts +213 -0
  71. package/dist/managers/room-management-manager.d.ts.map +1 -0
  72. package/dist/managers/room-management-manager.js +440 -0
  73. package/dist/managers/room-management-manager.js.map +1 -0
  74. package/dist/managers/room-manager.d.ts +4 -4
  75. package/dist/managers/room-manager.d.ts.map +1 -1
  76. package/dist/managers/room-manager.js.map +1 -1
  77. package/dist/teneo-sdk.d.ts +333 -13
  78. package/dist/teneo-sdk.d.ts.map +1 -1
  79. package/dist/teneo-sdk.js +468 -1
  80. package/dist/teneo-sdk.js.map +1 -1
  81. package/dist/types/config.d.ts +63 -54
  82. package/dist/types/config.d.ts.map +1 -1
  83. package/dist/types/config.js +8 -4
  84. package/dist/types/config.js.map +1 -1
  85. package/dist/types/error-codes.d.ts +2 -0
  86. package/dist/types/error-codes.d.ts.map +1 -1
  87. package/dist/types/error-codes.js +3 -0
  88. package/dist/types/error-codes.js.map +1 -1
  89. package/dist/types/events.d.ts +132 -68
  90. package/dist/types/events.d.ts.map +1 -1
  91. package/dist/types/events.js.map +1 -1
  92. package/dist/types/index.d.ts +1 -1
  93. package/dist/types/index.d.ts.map +1 -1
  94. package/dist/types/index.js +27 -2
  95. package/dist/types/index.js.map +1 -1
  96. package/dist/types/messages.d.ts +11396 -2559
  97. package/dist/types/messages.d.ts.map +1 -1
  98. package/dist/types/messages.js +294 -27
  99. package/dist/types/messages.js.map +1 -1
  100. package/examples/.env.example +1 -1
  101. package/examples/agent-room-management-example.ts +334 -0
  102. package/examples/claude-agent-x-follower/.env.example +2 -2
  103. package/examples/claude-agent-x-follower/QUICKSTART.md +1 -1
  104. package/examples/claude-agent-x-follower/README.md +1 -1
  105. package/examples/n8n-teneo/.env.example +2 -2
  106. package/examples/n8n-teneo/README.md +1 -1
  107. package/examples/openai-teneo/.env.example +2 -2
  108. package/examples/openai-teneo/README.md +1 -1
  109. package/examples/production-dashboard/.env.example +2 -2
  110. package/examples/production-dashboard/README.md +89 -12
  111. package/examples/production-dashboard/public/dashboard.html +1173 -601
  112. package/examples/production-dashboard/server.ts +347 -5
  113. package/examples/room-management-example.ts +285 -0
  114. package/examples/usage/.env.example +1 -1
  115. package/examples/usage/01-connect.ts +1 -1
  116. package/examples/usage/02-list-agents.ts +1 -1
  117. package/examples/usage/03-pick-agent.ts +1 -1
  118. package/examples/usage/04-find-by-capability.ts +1 -1
  119. package/examples/usage/05-webhook-example.ts +1 -1
  120. package/examples/usage/06-simple-api-server.ts +1 -1
  121. package/examples/usage/07-event-listener.ts +1 -1
  122. package/examples/usage/README.md +1 -1
  123. package/package.json +9 -1
  124. package/src/core/websocket-client.ts +26 -2
  125. package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +83 -0
  126. package/src/handlers/message-handlers/agent-status-update-handler.ts +58 -0
  127. package/src/handlers/message-handlers/auth-message-handler.ts +73 -5
  128. package/src/handlers/message-handlers/auth-success-handler.ts +58 -6
  129. package/src/handlers/message-handlers/index.ts +19 -0
  130. package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
  131. package/src/handlers/message-handlers/list-room-agents-handler.ts +61 -0
  132. package/src/handlers/message-handlers/room-operation-response-handler.ts +105 -0
  133. package/src/handlers/message-handlers/types.ts +6 -0
  134. package/src/managers/agent-room-manager.ts +609 -0
  135. package/src/managers/index.ts +2 -0
  136. package/src/managers/room-management-manager.ts +523 -0
  137. package/src/managers/room-manager.ts +4 -5
  138. package/src/teneo-sdk.ts +505 -4
  139. package/src/types/config.ts +10 -5
  140. package/src/types/error-codes.ts +4 -0
  141. package/src/types/events.ts +24 -0
  142. package/src/types/index.ts +55 -0
  143. package/src/types/messages.ts +374 -41
  144. package/tests/integration/room-management.test.ts +514 -0
  145. package/tests/integration/websocket.test.ts +1 -1
  146. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +394 -0
  147. package/tests/unit/handlers/agent-status-update-handler.test.ts +407 -0
  148. package/tests/unit/handlers/auth-success-handler-rooms.test.ts +699 -0
  149. package/tests/unit/handlers/list-available-agents-handler.test.ts +256 -0
  150. package/tests/unit/handlers/list-room-agents-handler.test.ts +294 -0
  151. package/tests/unit/handlers/room-operation-response-handler.test.ts +527 -0
  152. package/tests/unit/managers/agent-room-manager.test.ts +534 -0
  153. 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
+ });