@teneo-protocol/sdk 1.0.0 → 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 (211) 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 +13 -0
  5. package/dist/core/websocket-client.d.ts.map +1 -1
  6. package/dist/core/websocket-client.js +34 -3
  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/regular-message-handler.js +1 -0
  53. package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
  54. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
  55. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
  56. package/dist/handlers/message-handlers/room-operation-response-handler.js +92 -0
  57. package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
  58. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
  59. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  60. package/dist/handlers/message-handlers/types.d.ts +2 -0
  61. package/dist/handlers/message-handlers/types.d.ts.map +1 -1
  62. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
  63. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  64. package/dist/managers/agent-room-manager.d.ts +222 -0
  65. package/dist/managers/agent-room-manager.d.ts.map +1 -0
  66. package/dist/managers/agent-room-manager.js +508 -0
  67. package/dist/managers/agent-room-manager.js.map +1 -0
  68. package/dist/managers/index.d.ts +2 -0
  69. package/dist/managers/index.d.ts.map +1 -1
  70. package/dist/managers/index.js +5 -1
  71. package/dist/managers/index.js.map +1 -1
  72. package/dist/managers/message-router.d.ts +1 -1
  73. package/dist/managers/message-router.d.ts.map +1 -1
  74. package/dist/managers/message-router.js +41 -4
  75. package/dist/managers/message-router.js.map +1 -1
  76. package/dist/managers/room-management-manager.d.ts +213 -0
  77. package/dist/managers/room-management-manager.d.ts.map +1 -0
  78. package/dist/managers/room-management-manager.js +440 -0
  79. package/dist/managers/room-management-manager.js.map +1 -0
  80. package/dist/managers/room-manager.d.ts +4 -4
  81. package/dist/managers/room-manager.d.ts.map +1 -1
  82. package/dist/managers/room-manager.js +1 -1
  83. package/dist/managers/room-manager.js.map +1 -1
  84. package/dist/teneo-sdk.d.ts +362 -14
  85. package/dist/teneo-sdk.d.ts.map +1 -1
  86. package/dist/teneo-sdk.js +497 -7
  87. package/dist/teneo-sdk.js.map +1 -1
  88. package/dist/types/config.d.ts +63 -54
  89. package/dist/types/config.d.ts.map +1 -1
  90. package/dist/types/config.js +9 -5
  91. package/dist/types/config.js.map +1 -1
  92. package/dist/types/error-codes.d.ts +2 -0
  93. package/dist/types/error-codes.d.ts.map +1 -1
  94. package/dist/types/error-codes.js +3 -0
  95. package/dist/types/error-codes.js.map +1 -1
  96. package/dist/types/events.d.ts +132 -68
  97. package/dist/types/events.d.ts.map +1 -1
  98. package/dist/types/events.js.map +1 -1
  99. package/dist/types/index.d.ts +1 -1
  100. package/dist/types/index.d.ts.map +1 -1
  101. package/dist/types/index.js +27 -2
  102. package/dist/types/index.js.map +1 -1
  103. package/dist/types/messages.d.ts +11396 -2559
  104. package/dist/types/messages.d.ts.map +1 -1
  105. package/dist/types/messages.js +294 -27
  106. package/dist/types/messages.js.map +1 -1
  107. package/dist/types/validation.d.ts.map +1 -1
  108. package/dist/types/validation.js +1 -1
  109. package/dist/types/validation.js.map +1 -1
  110. package/dist/utils/bounded-queue.d.ts +1 -1
  111. package/dist/utils/bounded-queue.js +6 -6
  112. package/dist/utils/circuit-breaker.d.ts.map +1 -1
  113. package/dist/utils/circuit-breaker.js.map +1 -1
  114. package/dist/utils/event-waiter.d.ts.map +1 -1
  115. package/dist/utils/event-waiter.js +2 -1
  116. package/dist/utils/event-waiter.js.map +1 -1
  117. package/dist/utils/rate-limiter.d.ts.map +1 -1
  118. package/dist/utils/rate-limiter.js +4 -6
  119. package/dist/utils/rate-limiter.js.map +1 -1
  120. package/dist/utils/secure-private-key.d.ts.map +1 -1
  121. package/dist/utils/secure-private-key.js +9 -15
  122. package/dist/utils/secure-private-key.js.map +1 -1
  123. package/dist/utils/signature-verifier.d.ts +2 -2
  124. package/dist/utils/signature-verifier.d.ts.map +1 -1
  125. package/dist/utils/signature-verifier.js +5 -5
  126. package/dist/utils/signature-verifier.js.map +1 -1
  127. package/examples/.env.example +1 -1
  128. package/examples/agent-room-management-example.ts +334 -0
  129. package/examples/claude-agent-x-follower/.env.example +117 -0
  130. package/examples/claude-agent-x-follower/QUICKSTART.md +243 -0
  131. package/examples/claude-agent-x-follower/README.md +540 -0
  132. package/examples/claude-agent-x-follower/index.ts +248 -0
  133. package/examples/claude-agent-x-follower/package.json +37 -0
  134. package/examples/claude-agent-x-follower/tsconfig.json +20 -0
  135. package/examples/n8n-teneo/.env.example +127 -0
  136. package/examples/n8n-teneo/Dockerfile +42 -0
  137. package/examples/n8n-teneo/README.md +564 -0
  138. package/examples/n8n-teneo/docker-compose.yml +71 -0
  139. package/examples/n8n-teneo/index.ts +177 -0
  140. package/examples/n8n-teneo/package.json +22 -0
  141. package/examples/n8n-teneo/tsconfig.json +12 -0
  142. package/examples/n8n-teneo/workflows/x-timeline.json +66 -0
  143. package/examples/openai-teneo/.env.example +130 -0
  144. package/examples/openai-teneo/README.md +635 -0
  145. package/examples/openai-teneo/index.ts +280 -0
  146. package/examples/openai-teneo/package.json +24 -0
  147. package/examples/openai-teneo/tsconfig.json +16 -0
  148. package/examples/production-dashboard/.env.example +5 -3
  149. package/examples/production-dashboard/README.md +839 -0
  150. package/examples/production-dashboard/pnpm-lock.yaml +92 -0
  151. package/examples/production-dashboard/public/dashboard.html +1150 -504
  152. package/examples/production-dashboard/server.ts +428 -12
  153. package/examples/room-management-example.ts +285 -0
  154. package/examples/usage/.env.example +17 -0
  155. package/examples/usage/01-connect.ts +116 -0
  156. package/examples/usage/02-list-agents.ts +153 -0
  157. package/examples/usage/03-pick-agent.ts +201 -0
  158. package/examples/usage/04-find-by-capability.ts +237 -0
  159. package/examples/usage/05-webhook-example.ts +319 -0
  160. package/examples/usage/06-simple-api-server.ts +396 -0
  161. package/examples/usage/07-event-listener.ts +402 -0
  162. package/examples/usage/README.md +383 -0
  163. package/examples/usage/package.json +42 -0
  164. package/package.json +13 -3
  165. package/src/core/websocket-client.ts +43 -9
  166. package/src/formatters/response-formatter.test.ts +8 -2
  167. package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +83 -0
  168. package/src/handlers/message-handlers/agent-status-update-handler.ts +58 -0
  169. package/src/handlers/message-handlers/auth-message-handler.ts +73 -5
  170. package/src/handlers/message-handlers/auth-success-handler.ts +58 -6
  171. package/src/handlers/message-handlers/index.ts +19 -0
  172. package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
  173. package/src/handlers/message-handlers/list-room-agents-handler.ts +61 -0
  174. package/src/handlers/message-handlers/regular-message-handler.ts +1 -0
  175. package/src/handlers/message-handlers/room-operation-response-handler.ts +105 -0
  176. package/src/handlers/message-handlers/types.ts +6 -0
  177. package/src/handlers/webhook-handler.test.ts +13 -10
  178. package/src/managers/agent-room-manager.ts +609 -0
  179. package/src/managers/index.ts +2 -0
  180. package/src/managers/message-router.ts +48 -6
  181. package/src/managers/room-management-manager.ts +523 -0
  182. package/src/managers/room-manager.ts +12 -6
  183. package/src/teneo-sdk.ts +543 -10
  184. package/src/types/config.ts +13 -6
  185. package/src/types/error-codes.ts +4 -0
  186. package/src/types/events.ts +24 -0
  187. package/src/types/index.ts +55 -0
  188. package/src/types/messages.ts +374 -41
  189. package/src/types/validation.ts +4 -1
  190. package/src/utils/bounded-queue.ts +9 -9
  191. package/src/utils/circuit-breaker.ts +4 -1
  192. package/src/utils/deduplication-cache.test.ts +2 -6
  193. package/src/utils/event-waiter.test.ts +4 -1
  194. package/src/utils/event-waiter.ts +5 -7
  195. package/src/utils/rate-limiter.test.ts +5 -17
  196. package/src/utils/rate-limiter.ts +6 -9
  197. package/src/utils/secure-private-key.test.ts +66 -59
  198. package/src/utils/secure-private-key.ts +10 -16
  199. package/src/utils/signature-verifier.test.ts +75 -70
  200. package/src/utils/signature-verifier.ts +7 -8
  201. package/src/utils/ssrf-validator.test.ts +3 -3
  202. package/tests/integration/room-management.test.ts +514 -0
  203. package/tests/integration/websocket.test.ts +1 -1
  204. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +394 -0
  205. package/tests/unit/handlers/agent-status-update-handler.test.ts +407 -0
  206. package/tests/unit/handlers/auth-success-handler-rooms.test.ts +699 -0
  207. package/tests/unit/handlers/list-available-agents-handler.test.ts +256 -0
  208. package/tests/unit/handlers/list-room-agents-handler.test.ts +294 -0
  209. package/tests/unit/handlers/room-operation-response-handler.test.ts +527 -0
  210. package/tests/unit/managers/agent-room-manager.test.ts +534 -0
  211. package/tests/unit/managers/room-management-manager.test.ts +438 -0
package/README.md CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  **Connect your app to the Teneo AI Agent Network**
4
4
 
5
- [![npm version](https://img.shields.io/badge/version-1.0.0-blue)](https://www.npmjs.com/package/@teneo-protocol/sdk)
5
+ [![npm version](https://img.shields.io/badge/version-2.0.0-blue)](https://www.npmjs.com/package/@teneo-protocol/sdk)
6
6
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue)](https://www.typescriptlang.org/)
7
7
  [![Node.js](https://img.shields.io/badge/Node.js-%3E%3D18-green)](https://nodejs.org/)
8
- [![Tests](https://img.shields.io/badge/tests-488%20passing-success)](/)
8
+ [![Tests](https://img.shields.io/badge/tests-671%20passing-success)](/)
9
9
 
10
10
  The Teneo Protocol SDK lets you connect your application to a **decentralized network of specialized AI agents**. Instead of calling a single AI model, your app taps into an entire ecosystem where:
11
11
 
@@ -30,7 +30,7 @@ import { TeneoSDK } from "@teneo-protocol/sdk";
30
30
 
31
31
  // 1. Initialize with your Ethereum private key
32
32
  const sdk = new TeneoSDK({
33
- wsUrl: "wss://developer.chatroom.teneo-protocol.ai/ws",
33
+ wsUrl: "wss://your-teneo-server.com/ws",
34
34
  privateKey: "your_private_key_here" // No 0x prefix
35
35
  });
36
36
 
@@ -47,12 +47,42 @@ await sdk.sendMessage("Give me the last 5 tweets from @elonmusk");
47
47
  ```
48
48
 
49
49
  **That's it!** The coordinator automatically:
50
+
50
51
  1. Routes your message to the right agent
51
52
  2. Gets the response
52
53
  3. Delivers it via the event you're listening to
53
54
 
54
55
  ---
55
56
 
57
+ ## ✨ What's New in v2.0
58
+
59
+ Version 2.0 introduces powerful **room management** and **agent customization** capabilities:
60
+
61
+ ### 🏠 Multi-Room Management
62
+
63
+ - **Create multiple rooms** for different contexts (crypto, gaming, research, etc.)
64
+ - **Update and delete** your owned rooms
65
+ - **Track room limits** based on your subscription tier
66
+ - **Invite members** to your rooms (coming soon)
67
+
68
+ ### 🤖 Agent Room Management
69
+
70
+ - **Customize which agents** are available in each room
71
+ - **Add/remove agents** from your owned rooms
72
+ - **List room agents** with caching for performance
73
+ - **Real-time agent status updates** for room availability
74
+
75
+ ### 📊 Enhanced APIs
76
+
77
+ - 8 new room management methods
78
+ - 8 new agent-room management methods
79
+ - 14 new events for room and agent operations
80
+ - Intelligent caching with 5-minute TTL
81
+
82
+ [Jump to Room Management API](#-room-management-api) | [Jump to Agent Room Management API](#-agent-room-management-api)
83
+
84
+ ---
85
+
56
86
  ## How It Works
57
87
 
58
88
  ### 1. Agent Network Architecture
@@ -88,6 +118,7 @@ Unlike traditional APIs with API keys, Teneo uses **Ethereum wallet signatures**
88
118
  ```
89
119
 
90
120
  This enables:
121
+
91
122
  - 🔐 **No API keys to manage** - Your wallet IS your identity
92
123
 
93
124
  ---
@@ -104,23 +135,35 @@ pnpm run build
104
135
 
105
136
  # Set credentials
106
137
  export PRIVATE_KEY=your_private_key
107
- export TENEO_WS_URL=wss://developer.chatroom.teneo-protocol.ai/ws
138
+ export TENEO_WS_URL=wss://your-teneo-server.com/ws
108
139
  ```
109
140
 
110
- ### Basic Usage Example
141
+ ### Production Dashboard Example
142
+
143
+ The **Production Dashboard** is a comprehensive example showcasing **ALL SDK features** in a real-world web application:
111
144
 
112
145
  ```bash
113
- npx ts-node examples/basic-usage.ts
146
+ pnpm example:dashboard
147
+ # or
148
+ cd examples/production-dashboard && bun run server.ts
114
149
  ```
115
150
 
116
- Demonstrates:
117
- - ✅ Connection and authentication
118
- - Agent discovery
119
- - ✅ Room management
120
- - ✅ Sending messages
121
- - ✅ Event listeners
122
- - ✅ Secure private key handling
151
+ Then open: **[http://localhost:3000](http://localhost:3000)**
152
+
153
+ **What it demonstrates:**
123
154
 
155
+ - ✅ **Full WebSocket Integration** - Connection, authentication, auto-reconnection
156
+ - ✅ **Room Management (v2.0)** - Create, update, delete rooms with ownership tracking
157
+ - ✅ **Agent-Room Management (v2.0)** - Add/remove agents, list room agents with caching
158
+ - ✅ **Message Sending** - Coordinator-based and direct agent commands
159
+ - ✅ **Real-time Updates** - Server-Sent Events (SSE) for live dashboard
160
+ - ✅ **Agent Discovery** - List agents with capabilities and status
161
+ - ✅ **Secure Private Key Handling** - AES-256-GCM encryption in memory
162
+ - ✅ **Webhook Integration** - Real-time event streaming with circuit breaker
163
+ - ✅ **Health Monitoring** - `/health` and `/metrics` endpoints
164
+ - ✅ **Complete Event System** - All SDK events with real-time UI updates
165
+
166
+ Built with **Hono** (fast web framework) and **Bun** (fast JavaScript runtime). See `examples/production-dashboard/README.md` for details.
124
167
 
125
168
  ---
126
169
 
@@ -139,14 +182,11 @@ const sdk = new TeneoSDK({
139
182
  await sdk.connect();
140
183
 
141
184
  // Wait for response (blocks until agent responds or timeout)
142
- const response = await sdk.sendMessage(
143
- "Give me the last 5 tweets from @elonmusk?",
144
- {
145
- waitForResponse: true,
146
- timeout: 30000, // 30 seconds
147
- format: "both" // Get both raw data and humanized text
148
- }
149
- );
185
+ const response = await sdk.sendMessage("Give me the last 5 tweets from @elonmusk?", {
186
+ waitForResponse: true,
187
+ timeout: 30000, // 30 seconds
188
+ format: "both" // Get both raw data and humanized text
189
+ });
150
190
 
151
191
  console.log("Agent:", response.agentName);
152
192
  console.log("Answer:", response.humanized);
@@ -184,7 +224,6 @@ console.log("Active rooms:", rooms);
184
224
  // Output: Active rooms: ['Crawler Room', 'KOL tracker']
185
225
  ```
186
226
 
187
-
188
227
  ### Example 3: Webhook Integration
189
228
 
190
229
  Receive agent responses via HTTP POST to your server:
@@ -221,7 +260,7 @@ const sdk = new TeneoSDK({
221
260
  privateKey: process.env.PRIVATE_KEY!,
222
261
  webhookUrl: "https://your-webhook.com/",
223
262
  webhookHeaders: {
224
- "Authorization": "Bearer your-secret-token"
263
+ Authorization: "Bearer your-secret-token"
225
264
  }
226
265
  });
227
266
 
@@ -243,6 +282,310 @@ console.log("Circuit state:", status.circuitState); // OPEN/CLOSED/HALF_OPEN
243
282
 
244
283
  ---
245
284
 
285
+ ## 🏠 Room Management API
286
+
287
+ Create and manage multiple rooms for different contexts and use cases.
288
+
289
+ ### Creating Rooms
290
+
291
+ ```typescript
292
+ // Create a new room
293
+ const room = await sdk.createRoom({
294
+ name: "Crypto Research",
295
+ description: "Room for crypto analysis"
296
+ });
297
+ console.log(`Created room: ${room.id}`);
298
+
299
+ // Check if you can create more rooms
300
+ if (sdk.canCreateRoom()) {
301
+ await sdk.createRoom({ name: "Gaming Room" });
302
+ } else {
303
+ console.log(`Room limit reached: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
304
+ }
305
+ ```
306
+
307
+ ### Querying Rooms
308
+
309
+ ```typescript
310
+ // Get all owned rooms (rooms you created)
311
+ const ownedRooms = sdk.getOwnedRooms();
312
+ console.log(`You own ${ownedRooms.length} rooms:`);
313
+ ownedRooms.forEach((room) => {
314
+ console.log(` - ${room.name} (${room.is_public ? "Public" : "Private"})`);
315
+ });
316
+
317
+ // Get shared rooms (rooms you were invited to)
318
+ const sharedRooms = sdk.getSharedRooms();
319
+ console.log(`You have access to ${sharedRooms.length} shared rooms`);
320
+
321
+ // Get all rooms (owned + shared)
322
+ const allRooms = sdk.getAllRooms();
323
+ console.log(`Total rooms accessible: ${allRooms.length}`);
324
+
325
+ // Get specific room by ID
326
+ const room = sdk.getRoomById("room-123");
327
+ if (room) {
328
+ console.log(`Room: ${room.name}`);
329
+ console.log(`Created by: ${room.created_by}`);
330
+ console.log(`You are ${room.is_owner ? "owner" : "member"}`);
331
+ }
332
+
333
+ // Check room limits
334
+ console.log(`Room capacity: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
335
+ ```
336
+
337
+ ### Updating Rooms
338
+
339
+ ```typescript
340
+ // Update room details (owner only)
341
+ const updated = await sdk.updateRoom("room-123", {
342
+ name: "Updated Room Name",
343
+ description: "New description"
344
+ });
345
+
346
+ console.log(`Room updated: ${updated.name}`);
347
+ ```
348
+
349
+ ### Deleting Rooms
350
+
351
+ ```typescript
352
+ // Delete a room you own
353
+ await sdk.deleteRoom("room-123");
354
+ console.log("Room deleted");
355
+
356
+ // Listen for deletion events
357
+ sdk.on("room:deleted", (roomId) => {
358
+ console.log(`Room ${roomId} was deleted`);
359
+ });
360
+ ```
361
+
362
+ ### Room Events
363
+
364
+ ```typescript
365
+ // Room lifecycle events
366
+ sdk.on("room:created", (room) => {
367
+ console.log(`✅ Created: ${room.name}`);
368
+ });
369
+
370
+ sdk.on("room:updated", (room) => {
371
+ console.log(`📝 Updated: ${room.name}`);
372
+ });
373
+
374
+ sdk.on("room:deleted", (roomId) => {
375
+ console.log(`🗑️ Deleted: ${roomId}`);
376
+ });
377
+
378
+ // Error handling
379
+ sdk.on("room:create_error", (error) => {
380
+ console.error(`Failed to create room: ${error.message}`);
381
+ });
382
+
383
+ sdk.on("room:update_error", (error, roomId) => {
384
+ console.error(`Failed to update room ${roomId}: ${error.message}`);
385
+ });
386
+
387
+ sdk.on("room:delete_error", (error, roomId) => {
388
+ console.error(`Failed to delete room ${roomId}: ${error.message}`);
389
+ });
390
+ ```
391
+
392
+ ---
393
+
394
+ ## 🤖 Agent Room Management API
395
+
396
+ Customize which agents are available in each of your rooms.
397
+
398
+ ### Adding Agents to Rooms
399
+
400
+ ```typescript
401
+ // Add an agent to your room (owner only)
402
+ await sdk.addAgentToRoom("room-123", "agent-456");
403
+ console.log("Agent added to room");
404
+
405
+ // Listen for confirmation
406
+ sdk.on("agent_room:agent_added", (roomId, agentId) => {
407
+ console.log(`✅ Agent ${agentId} added to room ${roomId}`);
408
+ });
409
+ ```
410
+
411
+ ### Removing Agents from Rooms
412
+
413
+ ```typescript
414
+ // Remove an agent from your room (owner only)
415
+ await sdk.removeAgentFromRoom("room-123", "agent-456");
416
+ console.log("Agent removed from room");
417
+
418
+ // Listen for confirmation
419
+ sdk.on("agent_room:agent_removed", (roomId, agentId) => {
420
+ console.log(`🗑️ Agent ${agentId} removed from room ${roomId}`);
421
+ });
422
+ ```
423
+
424
+ ### Listing Room Agents
425
+
426
+ ```typescript
427
+ // List all agents in a room (with 5-minute cache)
428
+ const roomAgents = await sdk.listRoomAgents("room-123");
429
+ console.log(`${roomAgents.length} agents in this room:`);
430
+ roomAgents.forEach((agent) => {
431
+ console.log(` - ${agent.agent_name} (${agent.status})`);
432
+ if (agent.capabilities) {
433
+ console.log(` Capabilities: ${agent.capabilities.map((c) => c.name).join(", ")}`);
434
+ }
435
+ });
436
+
437
+ // Force refresh (bypass cache)
438
+ const freshAgents = await sdk.listRoomAgents("room-123", false);
439
+ ```
440
+
441
+ ### Listing Available Agents
442
+
443
+ ```typescript
444
+ // List agents NOT yet in the room (available to add)
445
+ const available = await sdk.listAvailableAgents("room-123");
446
+ console.log(`${available.length} agents available to add:`);
447
+ available.forEach((agent) => {
448
+ console.log(` - ${agent.agent_name}`);
449
+ if (agent.description) {
450
+ console.log(` ${agent.description}`);
451
+ }
452
+ });
453
+ ```
454
+
455
+ ### Query Methods (Synchronous - from cache)
456
+
457
+ ```typescript
458
+ // Check if specific agent is in room (instant, no network call)
459
+ const isInRoom = sdk.isAgentInRoom("room-123", "agent-456");
460
+ if (isInRoom === true) {
461
+ console.log("Agent is in the room");
462
+ } else if (isInRoom === false) {
463
+ console.log("Agent is NOT in the room");
464
+ } else {
465
+ console.log("Cache not available - call listRoomAgents() first");
466
+ }
467
+
468
+ // Get room agent count (instant)
469
+ const count = sdk.getRoomAgentCount("room-123");
470
+ if (count !== undefined) {
471
+ console.log(`Room has ${count} agents`);
472
+ }
473
+
474
+ // Get cached room agents (instant)
475
+ const cached = sdk.getRoomAgents("room-123");
476
+ if (cached) {
477
+ console.log("Agents:", cached.map((a) => a.agent_name).join(", "));
478
+ } else {
479
+ console.log("No cached data - call listRoomAgents() first");
480
+ }
481
+
482
+ // Get cached available agents (instant)
483
+ const cachedAvailable = sdk.getAvailableAgents("room-123");
484
+ ```
485
+
486
+ ### Cache Management
487
+
488
+ ```typescript
489
+ // Caching behavior:
490
+ // - listRoomAgents() and listAvailableAgents() cache results for 5 minutes
491
+ // - Cache automatically invalidated when you add/remove agents
492
+ // - Cache automatically invalidated on agent status updates
493
+
494
+ // Manual cache invalidation (if needed)
495
+ sdk.invalidateAgentRoomCache("room-123");
496
+ console.log("Cache cleared for room-123");
497
+ ```
498
+
499
+ ### Agent Room Events
500
+
501
+ ```typescript
502
+ // Agent add/remove events
503
+ sdk.on("agent_room:agent_added", (roomId, agentId) => {
504
+ console.log(`✅ Agent ${agentId} added to ${roomId}`);
505
+ });
506
+
507
+ sdk.on("agent_room:agent_removed", (roomId, agentId) => {
508
+ console.log(`🗑️ Agent ${agentId} removed from ${roomId}`);
509
+ });
510
+
511
+ // List events
512
+ sdk.on("agent_room:agents_listed", (roomId, agents) => {
513
+ console.log(`📋 ${agents.length} agents in room ${roomId}`);
514
+ });
515
+
516
+ sdk.on("agent_room:available_agents_listed", (agents) => {
517
+ console.log(`📋 ${agents.length} agents available to add`);
518
+ });
519
+
520
+ // Status updates (real-time)
521
+ sdk.on("agent_room:status_update", (data) => {
522
+ console.log(`🔄 Agent ${data.agentId} status updated in room ${data.roomId}`);
523
+ console.log(` New status: ${data.status}`);
524
+ });
525
+
526
+ // Error handling
527
+ sdk.on("agent_room:add_error", (error, roomId) => {
528
+ console.error(`Failed to add agent to ${roomId}: ${error.message}`);
529
+ });
530
+
531
+ sdk.on("agent_room:remove_error", (error, roomId) => {
532
+ console.error(`Failed to remove agent from ${roomId}: ${error.message}`);
533
+ });
534
+
535
+ sdk.on("agent_room:list_error", (error, roomId) => {
536
+ console.error(`Failed to list agents in ${roomId}: ${error.message}`);
537
+ });
538
+
539
+ sdk.on("agent_room:list_available_error", (error, roomId) => {
540
+ console.error(`Failed to list available agents for ${roomId}: ${error.message}`);
541
+ });
542
+ ```
543
+
544
+ ### Complete Example: Room Setup
545
+
546
+ ```typescript
547
+ // Complete workflow: Create room and customize agents
548
+ async function setupCustomRoom() {
549
+ // 1. Create a new room
550
+ const room = await sdk.createRoom({
551
+ name: "My Custom Room",
552
+ description: "Specialized agent room"
553
+ });
554
+ console.log(`✅ Created room: ${room.id}`);
555
+
556
+ // 2. See what agents are available
557
+ const available = await sdk.listAvailableAgents(room.id);
558
+ console.log(`${available.length} agents available`);
559
+
560
+ // 3. Add specific agents you want
561
+ const cryptoAgent = available.find((a) => a.agent_name?.includes("Crypto"));
562
+ if (cryptoAgent) {
563
+ await sdk.addAgentToRoom(room.id, cryptoAgent.agent_id);
564
+ console.log(`✅ Added ${cryptoAgent.agent_name}`);
565
+ }
566
+
567
+ const analyticsAgent = available.find((a) => a.agent_name?.includes("Analytics"));
568
+ if (analyticsAgent) {
569
+ await sdk.addAgentToRoom(room.id, analyticsAgent.agent_id);
570
+ console.log(`✅ Added ${analyticsAgent.agent_name}`);
571
+ }
572
+
573
+ // 4. Verify room configuration
574
+ const roomAgents = await sdk.listRoomAgents(room.id);
575
+ console.log(`\n🎯 Room configured with ${roomAgents.length} agents:`);
576
+ roomAgents.forEach((agent) => {
577
+ console.log(` - ${agent.agent_name}`);
578
+ });
579
+
580
+ // 5. Now send messages to this room
581
+ await sdk.sendMessage("Analyze BTC price trends", { room: room.id });
582
+ }
583
+
584
+ setupCustomRoom();
585
+ ```
586
+
587
+ ---
588
+
246
589
  ## 🎨 Event System
247
590
 
248
591
  The SDK is fully event-driven. Subscribe to what matters:
@@ -254,7 +597,9 @@ sdk.on("connection:open", () => console.log("🔌 WebSocket connected"));
254
597
  sdk.on("connection:close", (code, reason) => console.log(`❌ Disconnected: ${reason}`));
255
598
  sdk.on("connection:reconnecting", (attempt) => console.log(`🔄 Reconnecting (attempt ${attempt})`));
256
599
 
257
- sdk.on("auth:challenge", (challenge) => console.log("🔐 Challenge received, signing with wallet..."));
600
+ sdk.on("auth:challenge", (challenge) =>
601
+ console.log("🔐 Challenge received, signing with wallet...")
602
+ );
258
603
  sdk.on("auth:success", (state) => {
259
604
  console.log(`✅ Authenticated as ${state.walletAddress}`);
260
605
  console.log(`Whitelisted: ${state.isWhitelisted}`);
@@ -277,7 +622,7 @@ sdk.on("agent:response", (response) => {
277
622
 
278
623
  sdk.on("agent:list", (agents) => {
279
624
  console.log(`📋 Agent list updated: ${agents.length} agents available`);
280
- agents.forEach(agent => {
625
+ agents.forEach((agent) => {
281
626
  console.log(` - ${agent.name}: ${agent.capabilities?.join(", ")}`);
282
627
  });
283
628
  });
@@ -304,7 +649,7 @@ sdk.on("room:unsubscribed", (data) => {
304
649
 
305
650
  ```typescript
306
651
  const sdk = new TeneoSDK({
307
- wsUrl: "wss://developer.chatroom.teneo-protocol.ai/ws",
652
+ wsUrl: "wss://your-teneo-server.com/ws",
308
653
  privateKey: "your_key", // No 0x prefix
309
654
  defaultRoom: "general",
310
655
  reconnect: true,
@@ -322,7 +667,7 @@ const secureKey = new SecurePrivateKey(process.env.PRIVATE_KEY!);
322
667
 
323
668
  const config = new SDKConfigBuilder()
324
669
  // Required
325
- .withWebSocketUrl("wss://developer.chatroom.teneo-protocol.ai/ws")
670
+ .withWebSocketUrl("wss://your-teneo-server.com/ws")
326
671
  .withAuthentication(secureKey) // Encrypted key
327
672
 
328
673
  // Rooms
@@ -331,15 +676,15 @@ const config = new SDKConfigBuilder()
331
676
  // Reconnection strategy
332
677
  .withReconnectionStrategy({
333
678
  type: "exponential",
334
- baseDelay: 3000, // Start at 3 seconds
335
- maxDelay: 120000, // Cap at 2 minutes
679
+ baseDelay: 3000, // Start at 3 seconds
680
+ maxDelay: 120000, // Cap at 2 minutes
336
681
  maxAttempts: 20,
337
- jitter: true // Prevent thundering herd
682
+ jitter: true // Prevent thundering herd
338
683
  })
339
684
 
340
685
  // Webhook with retry
341
686
  .withWebhook("https://your-server.com/webhook", {
342
- "Authorization": "Bearer token"
687
+ Authorization: "Bearer token"
343
688
  })
344
689
  .withWebhookRetryStrategy({
345
690
  type: "exponential",
@@ -350,7 +695,7 @@ const config = new SDKConfigBuilder()
350
695
 
351
696
  // Response formatting
352
697
  .withResponseFormat({
353
- format: "both", // 'raw' | 'humanized' | 'both'
698
+ format: "both", // 'raw' | 'humanized' | 'both'
354
699
  includeMetadata: true
355
700
  })
356
701
 
@@ -362,7 +707,7 @@ const config = new SDKConfigBuilder()
362
707
  })
363
708
 
364
709
  // Performance
365
- .withRateLimit(10, 20) // 10 msg/sec, burst 20
710
+ .withRateLimit(10, 20) // 10 msg/sec, burst 20
366
711
  .withMessageDeduplication(true, 60000, 10000)
367
712
  .withLogging("debug")
368
713
 
@@ -376,7 +721,7 @@ const sdk = new TeneoSDK(config);
376
721
  Create `.env`:
377
722
 
378
723
  ```bash
379
- TENEO_WS_URL=wss://developer.chatroom.teneo-protocol.ai/ws
724
+ TENEO_WS_URL=wss://your-teneo-server.com/ws
380
725
  PRIVATE_KEY=your_private_key_without_0x
381
726
  WALLET_ADDRESS=0xYourWalletAddress
382
727
  DEFAULT_ROOM=general
@@ -448,11 +793,11 @@ console.log("Circuit state:", status.circuitState);
448
793
 
449
794
  Configurable exponential backoff, linear, or constant delays:
450
795
 
451
- | Strategy | Formula | Example (base=2s, mult=2) |
452
- |----------|---------|---------------------------|
453
- | **Exponential** | `base * mult^attempt` | 2s, 4s, 8s, 16s, 32s |
454
- | **Linear** | `base * attempt` | 2s, 4s, 6s, 8s, 10s |
455
- | **Constant** | `base` | 2s, 2s, 2s, 2s, 2s |
796
+ | Strategy | Formula | Example (base=2s, mult=2) |
797
+ | --------------- | --------------------- | ------------------------- |
798
+ | **Exponential** | `base * mult^attempt` | 2s, 4s, 8s, 16s, 32s |
799
+ | **Linear** | `base * attempt` | 2s, 4s, 6s, 8s, 10s |
800
+ | **Constant** | `base` | 2s, 2s, 2s, 2s, 2s |
456
801
 
457
802
  ```typescript
458
803
  const config = new SDKConfigBuilder()
@@ -461,7 +806,7 @@ const config = new SDKConfigBuilder()
461
806
  baseDelay: 3000,
462
807
  maxDelay: 120000,
463
808
  maxAttempts: 20,
464
- jitter: true // Add 0-1000ms randomness
809
+ jitter: true // Add 0-1000ms randomness
465
810
  })
466
811
  .build();
467
812
  ```
@@ -473,9 +818,9 @@ Prevents duplicate message processing with TTL-based cache:
473
818
  ```typescript
474
819
  const config = new SDKConfigBuilder()
475
820
  .withMessageDeduplication(
476
- true, // Enable
477
- 300000, // 5 minute TTL
478
- 10000 // Cache up to 10k message IDs
821
+ true, // Enable
822
+ 300000, // 5 minute TTL
823
+ 10000 // Cache up to 10k message IDs
479
824
  )
480
825
  .build();
481
826
 
@@ -569,6 +914,7 @@ if (dedup) {
569
914
  ### Issue: "ERR_REQUIRE_ESM" Error
570
915
 
571
916
  **Problem:**
917
+
572
918
  ```
573
919
  Error [ERR_REQUIRE_ESM]: require() of ES Module node-fetch not supported
574
920
  ```
@@ -585,6 +931,7 @@ npx ts-node your-app.ts
585
931
  ```
586
932
 
587
933
  **Alternative:** Install node-fetch v2:
934
+
588
935
  ```bash
589
936
  npm install node-fetch@2.7.0
590
937
  npm run build
@@ -596,19 +943,22 @@ npm run build
596
943
 
597
944
  **Solutions:**
598
945
 
599
- 1. **Check private key format (64 hex characters, no 0x):**
946
+ 1. **Check private key format (64 hex characters, + 0x prefix):**
947
+
600
948
  ```typescript
601
949
  // ✅ Good
602
- privateKey: "dafe885a73d87dc34b7933068423b40a646adf5cef45954265e9a1b9be6bad9d"
950
+ privateKey: "0xdafe885a73d87dc34b7933068423b40a646adf5cef45954265e9a1b9be6bad9d";
603
951
  ```
604
952
 
605
953
  2. **Verify key length:**
954
+
606
955
  ```bash
607
956
  echo -n "your_key" | wc -c
608
- # Should output: 64
957
+ # Should output: 64 + 0x prefix
609
958
  ```
610
959
 
611
960
  3. **Enable debug logging:**
961
+
612
962
  ```typescript
613
963
  const sdk = new TeneoSDK({
614
964
  wsUrl: "...",
@@ -620,6 +970,7 @@ npm run build
620
970
  ### Issue: Rate Limiting
621
971
 
622
972
  **Problem:**
973
+
623
974
  ```
624
975
  RateLimitError: Rate limit exceeded
625
976
  ```
@@ -630,7 +981,7 @@ RateLimitError: Rate limit exceeded
630
981
  ```typescript
631
982
  for (const message of messages) {
632
983
  await sdk.sendMessage(message);
633
- await new Promise(r => setTimeout(r, 200)); // 200ms delay
984
+ await new Promise((r) => setTimeout(r, 200)); // 200ms delay
634
985
  }
635
986
  ```
636
987
 
@@ -639,16 +990,18 @@ RateLimitError: Rate limit exceeded
639
990
  **Solutions:**
640
991
 
641
992
  1. **Verify HTTPS (except localhost):**
993
+
642
994
  ```typescript
643
995
  // ✅ Good
644
- webhookUrl: "https://your-server.com/webhook"
645
- webhookUrl: "http://localhost:3000/webhook"
996
+ webhookUrl: "https://your-server.com/webhook";
997
+ webhookUrl: "http://localhost:3000/webhook";
646
998
 
647
999
  // ❌ Bad
648
- webhookUrl: "http://your-server.com/webhook"
1000
+ webhookUrl: "http://your-server.com/webhook";
649
1001
  ```
650
1002
 
651
1003
  2. **Test manually:**
1004
+
652
1005
  ```bash
653
1006
  curl -X POST https://your-server.com/webhook \
654
1007
  -H "Content-Type: application/json" \
@@ -676,8 +1029,9 @@ npm run test:integration # Integration tests
676
1029
  ```
677
1030
 
678
1031
  **Test Results:**
679
- - ✅ 488 unit tests passing
680
- - ✅ 98.6% pass rate
1032
+
1033
+ - ✅ 671 unit tests passing
1034
+ - ✅ 100% pass rate (Phase 0-2 complete)
681
1035
  - ✅ Comprehensive coverage
682
1036
 
683
1037
  ---
@@ -701,7 +1055,6 @@ We welcome contributions!
701
1055
 
702
1056
  AGPL-3.0 License
703
1057
 
704
-
705
1058
  <div align="center">
706
1059
 
707
1060
  **Built with ❤️ by the [Teneo Team](https://teneo.pro)**
@@ -18,6 +18,9 @@ export declare class WebSocketClient extends EventEmitter<SDKEvents> {
18
18
  private deduplicationCache?;
19
19
  private reconnectPolicy;
20
20
  private roomManager?;
21
+ private roomManagementManager?;
22
+ private agentRoomManager?;
23
+ private intentionalDisconnect;
21
24
  private connectionState;
22
25
  private authState;
23
26
  private messageQueue;
@@ -31,6 +34,16 @@ export declare class WebSocketClient extends EventEmitter<SDKEvents> {
31
34
  * Called by TeneoSDK after initialization
32
35
  */
33
36
  setRoomManager(roomManager: any): void;
37
+ /**
38
+ * Sets the room management manager for room CRUD operations (v2.0.0)
39
+ * @internal
40
+ */
41
+ setRoomManagementManager(roomManagementManager: any): void;
42
+ /**
43
+ * Sets the agent room manager for agent-room operations (v2.0.0)
44
+ * @internal
45
+ */
46
+ setAgentRoomManager(agentRoomManager: any): void;
34
47
  /**
35
48
  * Establishes a WebSocket connection to the Teneo server.
36
49
  * Handles connection timeout, authentication challenge-response flow,