@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
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  /**
2
3
  * Production Dashboard Example - Hono + Bun
3
4
  *
@@ -15,6 +16,14 @@
15
16
  * - Real-time event streaming
16
17
  * - Complete error handling
17
18
  *
19
+ * 🆕 V2.0 Features:
20
+ * - Multi-room management (create, update, delete rooms)
21
+ * - Room ownership tracking (owned vs shared rooms)
22
+ * - Room limits and quotas
23
+ * - Agent-room customization (add/remove agents per room)
24
+ * - Agent-room caching with 5-minute TTL
25
+ * - Real-time agent status updates
26
+ *
18
27
  * Run with: bun run server.ts
19
28
  */
20
29
 
@@ -26,12 +35,10 @@ import type { AgentResponse } from "../../dist/index.js";
26
35
  import { SDKConfigBuilder, TeneoSDK, SecurePrivateKey } from "../../dist/index.js";
27
36
 
28
37
  // Load environment variables
29
- const PORT = parseInt(process.env.PORT || "3000");
30
- const WS_URL =
31
- process.env.WS_URL;
38
+ const PORT = parseInt(process.env.PORT || "3001");
39
+ const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
32
40
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
33
41
  const WALLET_ADDRESS = process.env.WALLET_ADDRESS || "";
34
- const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "as1LfBarJNzOIpOQJQ7PH";
35
42
  const ENABLE_SIG_VERIFICATION = process.env.ENABLE_SIGNATURE_VERIFICATION === "true";
36
43
  const TRUSTED_ADDRESSES = process.env.TRUSTED_ADDRESSES?.split(",").filter(Boolean) || [];
37
44
 
@@ -74,7 +81,6 @@ async function initializeSDK() {
74
81
  const config = new SDKConfigBuilder()
75
82
  .withWebSocketUrl(WS_URL)
76
83
  .withAuthentication(secureKey, WALLET_ADDRESS) // Pass SecurePrivateKey instead of plain string
77
- .withAutoJoinRooms([DEFAULT_ROOM])
78
84
  .withReconnection({ enabled: true, delay: 5000, maxAttempts: 10 })
79
85
  // REL-3: Configure custom retry strategies for production resilience
80
86
  .withReconnectionStrategy({
@@ -161,7 +167,9 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
161
167
 
162
168
  // Authentication events
163
169
  sdk.on("auth:challenge", (challenge) => {
164
- addEvent("auth:challenge", { challenge: challenge.substring(0, 20) + "..." });
170
+ addEvent("auth:challenge", {
171
+ challenge: challenge.substring(0, 20) + "..."
172
+ });
165
173
  });
166
174
 
167
175
  sdk.on("auth:success", (state) => {
@@ -195,7 +203,10 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
195
203
  messageId: message.id,
196
204
  from: message.from
197
205
  });
198
- broadcastSSE({ type: "message:duplicate", message: { type: message.type, id: message.id } });
206
+ broadcastSSE({
207
+ type: "message:duplicate",
208
+ message: { type: message.type, id: message.id }
209
+ });
199
210
  });
200
211
 
201
212
  // Agent events
@@ -231,12 +242,18 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
231
242
 
232
243
  // Room events
233
244
  sdk.on("room:subscribed", (data) => {
234
- addEvent("room:subscribed", { roomId: data.roomId, subscriptions: data.subscriptions });
245
+ addEvent("room:subscribed", {
246
+ roomId: data.roomId,
247
+ subscriptions: data.subscriptions
248
+ });
235
249
  broadcastSSE({ type: "room:subscribed", data });
236
250
  });
237
251
 
238
252
  sdk.on("room:unsubscribed", (data) => {
239
- addEvent("room:unsubscribed", { roomId: data.roomId, subscriptions: data.subscriptions });
253
+ addEvent("room:unsubscribed", {
254
+ roomId: data.roomId,
255
+ subscriptions: data.subscriptions
256
+ });
240
257
  broadcastSSE({ type: "room:unsubscribed", data });
241
258
  });
242
259
 
@@ -245,6 +262,81 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
245
262
  broadcastSSE({ type: "room:list", rooms });
246
263
  });
247
264
 
265
+ // Room Management events (v2.0.0)
266
+ sdk.on("room:created", (room) => {
267
+ addEvent("room:created", { roomId: room.id, name: room.name });
268
+ broadcastSSE({ type: "room:created", room });
269
+ });
270
+
271
+ sdk.on("room:updated", (room) => {
272
+ addEvent("room:updated", { roomId: room.id, name: room.name });
273
+ broadcastSSE({ type: "room:updated", room });
274
+ });
275
+
276
+ sdk.on("room:deleted", (roomId) => {
277
+ addEvent("room:deleted", { roomId });
278
+ broadcastSSE({ type: "room:deleted", roomId });
279
+ });
280
+
281
+ sdk.on("room:create_error", (error) => {
282
+ addEvent("room:create_error", { error: error.message });
283
+ errorCounter++;
284
+ });
285
+
286
+ sdk.on("room:update_error", (error, roomId) => {
287
+ addEvent("room:update_error", { error: error.message, roomId });
288
+ errorCounter++;
289
+ });
290
+
291
+ sdk.on("room:delete_error", (error, roomId) => {
292
+ addEvent("room:delete_error", { error: error.message, roomId });
293
+ errorCounter++;
294
+ });
295
+
296
+ // Agent Room Management events (v2.0.0)
297
+ sdk.on("agent_room:agent_added", (roomId, agentId) => {
298
+ addEvent("agent_room:agent_added", { roomId, agentId });
299
+ broadcastSSE({ type: "agent_room:agent_added", roomId, agentId });
300
+ });
301
+
302
+ sdk.on("agent_room:agent_removed", (roomId, agentId) => {
303
+ addEvent("agent_room:agent_removed", { roomId, agentId });
304
+ broadcastSSE({ type: "agent_room:agent_removed", roomId, agentId });
305
+ });
306
+
307
+ sdk.on("agent_room:agents_listed", (roomId, agents) => {
308
+ addEvent("agent_room:agents_listed", { roomId, count: agents.length });
309
+ });
310
+
311
+ sdk.on("agent_room:available_agents_listed", (agents) => {
312
+ addEvent("agent_room:available_agents_listed", { count: agents.length });
313
+ });
314
+
315
+ sdk.on("agent_room:status_update", (data) => {
316
+ addEvent("agent_room:status_update", data);
317
+ broadcastSSE({ type: "agent_room:status_update", data });
318
+ });
319
+
320
+ sdk.on("agent_room:add_error", (error, roomId) => {
321
+ addEvent("agent_room:add_error", { error: error.message, roomId });
322
+ errorCounter++;
323
+ });
324
+
325
+ sdk.on("agent_room:remove_error", (error, roomId) => {
326
+ addEvent("agent_room:remove_error", { error: error.message, roomId });
327
+ errorCounter++;
328
+ });
329
+
330
+ sdk.on("agent_room:list_error", (error, roomId) => {
331
+ addEvent("agent_room:list_error", { error: error.message, roomId });
332
+ errorCounter++;
333
+ });
334
+
335
+ sdk.on("agent_room:list_available_error", (error) => {
336
+ addEvent("agent_room:list_available_error", { error: error.message });
337
+ errorCounter++;
338
+ });
339
+
248
340
  // Webhook events
249
341
  sdk.on("webhook:sent", (payload, url) => {
250
342
  addEvent("webhook:sent", { event: payload.event, url });
@@ -272,7 +364,10 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
272
364
  recoverable: error.recoverable
273
365
  });
274
366
  errorCounter++;
275
- broadcastSSE({ type: "error", error: { message: error.message, code: error.code } });
367
+ broadcastSSE({
368
+ type: "error",
369
+ error: { message: error.message, code: error.code }
370
+ });
276
371
  });
277
372
 
278
373
  sdk.on("warning", (warning) => {
@@ -440,12 +535,16 @@ app.post("/api/message", async (c) => {
440
535
  }
441
536
 
442
537
  try {
443
- const { content, waitForResponse = false } = await c.req.json();
538
+ const { content, room, waitForResponse = false } = await c.req.json();
444
539
 
445
540
  if (!content || typeof content !== "string") {
446
541
  return c.json({ error: "Content is required" }, 400);
447
542
  }
448
543
 
544
+ if (!room || typeof room !== "string") {
545
+ return c.json({ error: "Room is required" }, 400);
546
+ }
547
+
449
548
  const messageId = `msg_${Date.now()}`;
450
549
  const storedMessage: StoredMessage = {
451
550
  id: messageId,
@@ -458,7 +557,7 @@ app.post("/api/message", async (c) => {
458
557
  messageCounter++;
459
558
 
460
559
  const response = await sdk.sendMessage(content, {
461
- room: DEFAULT_ROOM,
560
+ room,
462
561
  waitForResponse,
463
562
  timeout: 60000
464
563
  });
@@ -575,6 +674,93 @@ app.get("/api/rooms", (c) => {
575
674
  return c.json(rooms);
576
675
  });
577
676
 
677
+ // Get available rooms for sending messages (subscribed + private room + owned rooms)
678
+ app.get("/api/rooms/available", (c) => {
679
+ if (!sdk) {
680
+ return c.json({ error: "SDK not initialized" }, 503);
681
+ }
682
+
683
+ const authState = sdk.getAuthState();
684
+ const subscribedRooms = sdk.getSubscribedRooms();
685
+ const ownedRooms = sdk.getOwnedRooms(); // v2.0.0: Include newly created rooms
686
+ const sharedRooms = sdk.getSharedRooms(); // v2.0.0: Include shared rooms
687
+
688
+ // Combine all available rooms
689
+ const availableRooms: Array<{
690
+ id: string;
691
+ name: string;
692
+ type: string;
693
+ description?: string;
694
+ }> = [];
695
+
696
+ // Add subscribed public rooms
697
+ if (subscribedRooms && subscribedRooms.length > 0) {
698
+ subscribedRooms.forEach((roomId: string) => {
699
+ availableRooms.push({
700
+ id: roomId,
701
+ name: roomId,
702
+ type: "subscribed"
703
+ });
704
+ });
705
+ }
706
+
707
+ // Add rooms from auth state (includes both public and private rooms with full details)
708
+ if (authState.roomObjects && authState.roomObjects.length > 0) {
709
+ authState.roomObjects.forEach((room: any) => {
710
+ // Only add if not already in the list
711
+ if (!availableRooms.find((r) => r.id === room.id)) {
712
+ availableRooms.push({
713
+ id: room.id,
714
+ name: room.name || room.id,
715
+ type: room.is_public ? "public" : "private",
716
+ description: room.description
717
+ });
718
+ }
719
+ });
720
+ }
721
+
722
+ // Add owned rooms (v2.0.0) - includes newly created rooms
723
+ if (ownedRooms && ownedRooms.length > 0) {
724
+ ownedRooms.forEach((room) => {
725
+ // Only add if not already in the list
726
+ if (!availableRooms.find((r) => r.id === room.id)) {
727
+ availableRooms.push({
728
+ id: room.id,
729
+ name: room.name || room.id,
730
+ type: room.is_public ? "public" : "private",
731
+ description: room.description || undefined
732
+ });
733
+ }
734
+ });
735
+ }
736
+
737
+ // Add shared rooms (v2.0.0) - rooms user is a member of
738
+ if (sharedRooms && sharedRooms.length > 0) {
739
+ sharedRooms.forEach((room) => {
740
+ // Only add if not already in the list
741
+ if (!availableRooms.find((r) => r.id === room.id)) {
742
+ availableRooms.push({
743
+ id: room.id,
744
+ name: room.name || room.id,
745
+ type: room.is_public ? "public" : "private",
746
+ description: room.description || undefined
747
+ });
748
+ }
749
+ });
750
+ }
751
+
752
+ // Add private room ID if not already included
753
+ if (authState.privateRoomId && !availableRooms.find((r) => r.id === authState.privateRoomId)) {
754
+ availableRooms.push({
755
+ id: authState.privateRoomId,
756
+ name: "My Private Room",
757
+ type: "private"
758
+ });
759
+ }
760
+
761
+ return c.json(availableRooms);
762
+ });
763
+
578
764
  // List all rooms
579
765
  app.get("/api/rooms/list", async (c) => {
580
766
  if (!sdk || !sdk.isConnected) {
@@ -629,6 +815,236 @@ app.post("/api/room/leave", async (c) => {
629
815
  }
630
816
  });
631
817
 
818
+ // ========================================
819
+ // 🆕 V2.0 ROOM MANAGEMENT API
820
+ // ========================================
821
+
822
+ // Get owned rooms (v2.0)
823
+ app.get("/api/v2/rooms/owned", (c) => {
824
+ if (!sdk) {
825
+ return c.json({ error: "SDK not initialized" }, 503);
826
+ }
827
+
828
+ const ownedRooms = sdk.getOwnedRooms();
829
+ return c.json(ownedRooms);
830
+ });
831
+
832
+ // Get shared rooms (v2.0)
833
+ app.get("/api/v2/rooms/shared", (c) => {
834
+ if (!sdk) {
835
+ return c.json({ error: "SDK not initialized" }, 503);
836
+ }
837
+
838
+ const sharedRooms = sdk.getSharedRooms();
839
+ return c.json(sharedRooms);
840
+ });
841
+
842
+ // Get room limit info (v2.0)
843
+ app.get("/api/v2/rooms/limit", (c) => {
844
+ if (!sdk) {
845
+ return c.json({ error: "SDK not initialized" }, 503);
846
+ }
847
+
848
+ return c.json({
849
+ limit: sdk.getRoomLimit(),
850
+ count: sdk.getOwnedRoomCount(),
851
+ canCreate: sdk.canCreateRoom()
852
+ });
853
+ });
854
+
855
+ // Create room (v2.0)
856
+ app.post("/api/v2/rooms", async (c) => {
857
+ if (!sdk || !sdk.isConnected) {
858
+ return c.json({ error: "SDK not connected" }, 503);
859
+ }
860
+
861
+ try {
862
+ const { name, description } = await c.req.json();
863
+
864
+ if (!name) {
865
+ return c.json({ error: "Room name is required" }, 400);
866
+ }
867
+
868
+ const room = await sdk.createRoom({ name, description });
869
+ return c.json(room);
870
+ } catch (error: any) {
871
+ return c.json({ error: error.message }, 500);
872
+ }
873
+ });
874
+
875
+ // Update room (v2.0)
876
+ app.put("/api/v2/rooms/:id", async (c) => {
877
+ if (!sdk || !sdk.isConnected) {
878
+ return c.json({ error: "SDK not connected" }, 503);
879
+ }
880
+
881
+ try {
882
+ const roomId = c.req.param("id");
883
+ const updates = await c.req.json();
884
+
885
+ if (!updates.name && !updates.description) {
886
+ return c.json({ error: "At least one field (name or description) must be provided" }, 400);
887
+ }
888
+
889
+ const room = await sdk.updateRoom(roomId, updates);
890
+ return c.json(room);
891
+ } catch (error: any) {
892
+ return c.json({ error: error.message }, 500);
893
+ }
894
+ });
895
+
896
+ // Delete room (v2.0)
897
+ app.delete("/api/v2/rooms/:id", async (c) => {
898
+ if (!sdk || !sdk.isConnected) {
899
+ return c.json({ error: "SDK not connected" }, 503);
900
+ }
901
+
902
+ try {
903
+ const roomId = c.req.param("id");
904
+ await sdk.deleteRoom(roomId);
905
+ return c.json({ success: true, message: "Room deleted successfully" });
906
+ } catch (error: any) {
907
+ return c.json({ error: error.message }, 500);
908
+ }
909
+ });
910
+
911
+ // ========================================
912
+ // 🆕 V2.0 AGENT ROOM MANAGEMENT API
913
+ // ========================================
914
+
915
+ // List agents in a room (v2.0)
916
+ app.get("/api/v2/rooms/:id/agents", async (c) => {
917
+ if (!sdk || !sdk.isConnected) {
918
+ return c.json({ error: "SDK not connected" }, 503);
919
+ }
920
+
921
+ try {
922
+ const roomId = c.req.param("id");
923
+ const useCache = c.req.query("cache") !== "false"; // Default to true
924
+
925
+ const agents = await sdk.listRoomAgents(roomId, useCache);
926
+ return c.json({
927
+ roomId,
928
+ agents,
929
+ cached: useCache,
930
+ count: agents.length
931
+ });
932
+ } catch (error: any) {
933
+ return c.json({ error: error.message }, 500);
934
+ }
935
+ });
936
+
937
+ // List available agents for a room (v2.0)
938
+ app.get("/api/v2/rooms/:id/available-agents", async (c) => {
939
+ if (!sdk || !sdk.isConnected) {
940
+ return c.json({ error: "SDK not connected" }, 503);
941
+ }
942
+
943
+ try {
944
+ const roomId = c.req.param("id");
945
+ const useCache = c.req.query("cache") !== "false"; // Default to true
946
+
947
+ const agents = await sdk.listAvailableAgents(roomId, useCache);
948
+ return c.json({
949
+ roomId,
950
+ agents,
951
+ cached: useCache,
952
+ count: agents.length
953
+ });
954
+ } catch (error: any) {
955
+ return c.json({ error: error.message }, 500);
956
+ }
957
+ });
958
+
959
+ // Add agent to room (v2.0)
960
+ app.post("/api/v2/rooms/:roomId/agents/:agentId", async (c) => {
961
+ if (!sdk || !sdk.isConnected) {
962
+ return c.json({ error: "SDK not connected" }, 503);
963
+ }
964
+
965
+ try {
966
+ const roomId = c.req.param("roomId");
967
+ const agentId = c.req.param("agentId");
968
+
969
+ await sdk.addAgentToRoom(roomId, agentId);
970
+ return c.json({
971
+ success: true,
972
+ message: `Agent ${agentId} added to room ${roomId}`
973
+ });
974
+ } catch (error: any) {
975
+ return c.json({ error: error.message }, 500);
976
+ }
977
+ });
978
+
979
+ // Remove agent from room (v2.0)
980
+ app.delete("/api/v2/rooms/:roomId/agents/:agentId", async (c) => {
981
+ if (!sdk || !sdk.isConnected) {
982
+ return c.json({ error: "SDK not connected" }, 503);
983
+ }
984
+
985
+ try {
986
+ const roomId = c.req.param("roomId");
987
+ const agentId = c.req.param("agentId");
988
+
989
+ await sdk.removeAgentFromRoom(roomId, agentId);
990
+ return c.json({
991
+ success: true,
992
+ message: `Agent ${agentId} removed from room ${roomId}`
993
+ });
994
+ } catch (error: any) {
995
+ return c.json({ error: error.message }, 500);
996
+ }
997
+ });
998
+
999
+ // Check if agent is in room - instant cache query (v2.0)
1000
+ app.get("/api/v2/rooms/:roomId/agents/:agentId/check", (c) => {
1001
+ if (!sdk) {
1002
+ return c.json({ error: "SDK not initialized" }, 503);
1003
+ }
1004
+
1005
+ const roomId = c.req.param("roomId");
1006
+ const agentId = c.req.param("agentId");
1007
+ const isInRoom = sdk.isAgentInRoom(roomId, agentId);
1008
+
1009
+ return c.json({
1010
+ roomId,
1011
+ agentId,
1012
+ inRoom: isInRoom,
1013
+ cached: true
1014
+ });
1015
+ });
1016
+
1017
+ // Get room agent count - instant cache query (v2.0)
1018
+ app.get("/api/v2/rooms/:id/agents/count", (c) => {
1019
+ if (!sdk) {
1020
+ return c.json({ error: "SDK not initialized" }, 503);
1021
+ }
1022
+
1023
+ const roomId = c.req.param("id");
1024
+ const count = sdk.getRoomAgentCount(roomId);
1025
+
1026
+ return c.json({
1027
+ roomId,
1028
+ count,
1029
+ cached: true
1030
+ });
1031
+ });
1032
+
1033
+ // Invalidate agent-room cache for a room (v2.0)
1034
+ app.post("/api/v2/rooms/:id/cache/invalidate", (c) => {
1035
+ if (!sdk) {
1036
+ return c.json({ error: "SDK not initialized" }, 503);
1037
+ }
1038
+
1039
+ const roomId = c.req.param("id");
1040
+ sdk.invalidateAgentRoomCache(roomId);
1041
+
1042
+ return c.json({
1043
+ success: true,
1044
+ message: `Cache invalidated for room ${roomId}`
1045
+ });
1046
+ });
1047
+
632
1048
  // Get recent events
633
1049
  app.get("/api/events", (c) => {
634
1050
  return c.json(recentEvents.slice(0, 50));