@teneo-protocol/sdk 1.0.1 → 2.2.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 (352) hide show
  1. package/.eslintrc.json +11 -2
  2. package/.github/CODEOWNERS +2 -0
  3. package/.github/ISSUE_TEMPLATE/01-bug.yml +85 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  6. package/.github/workflows/claude-code-review.yml +8 -3
  7. package/.github/workflows/claude-reviewer.yml +6 -4
  8. package/.github/workflows/publish-npm.yml +9 -6
  9. package/.github/workflows/push-to-main.yml +1 -1
  10. package/.github/workflows/top-issue.yml +102 -0
  11. package/CHANGELOG.md +334 -0
  12. package/CONCEPTS.md +747 -0
  13. package/README.md +577 -54
  14. package/dist/constants.js +8 -8
  15. package/dist/constants.js.map +1 -1
  16. package/dist/core/websocket-client.d.ts +25 -1
  17. package/dist/core/websocket-client.d.ts.map +1 -1
  18. package/dist/core/websocket-client.js +74 -15
  19. package/dist/core/websocket-client.js.map +1 -1
  20. package/dist/formatters/response-formatter.js +4 -0
  21. package/dist/formatters/response-formatter.js.map +1 -1
  22. package/dist/handlers/message-handler-registry.js +2 -1
  23. package/dist/handlers/message-handler-registry.js.map +1 -1
  24. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +1666 -0
  25. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts.map +1 -0
  26. package/dist/handlers/message-handlers/agent-details-response-handler.js +38 -0
  27. package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -0
  28. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
  29. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
  30. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +67 -0
  31. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
  32. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
  33. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  34. package/dist/handlers/message-handlers/agent-selected-handler.js +2 -5
  35. package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -1
  36. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +1687 -0
  37. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
  38. package/dist/handlers/message-handlers/agent-status-update-handler.js +48 -0
  39. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
  40. package/dist/handlers/message-handlers/agents-list-handler.js +2 -5
  41. package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -1
  42. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +439 -0
  43. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -0
  44. package/dist/handlers/message-handlers/all-agents-response-handler.js +36 -0
  45. package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -0
  46. package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
  47. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  48. package/dist/handlers/message-handlers/auth-error-handler.js +2 -5
  49. package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -1
  50. package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
  51. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  52. package/dist/handlers/message-handlers/auth-message-handler.js +71 -10
  53. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  54. package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
  55. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  56. package/dist/handlers/message-handlers/auth-required-handler.js +2 -5
  57. package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -1
  58. package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
  59. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  60. package/dist/handlers/message-handlers/auth-success-handler.js +52 -9
  61. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  62. package/dist/handlers/message-handlers/base-handler.d.ts +4 -4
  63. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
  64. package/dist/handlers/message-handlers/base-handler.js +3 -1
  65. package/dist/handlers/message-handlers/base-handler.js.map +1 -1
  66. package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
  67. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  68. package/dist/handlers/message-handlers/challenge-handler.js +3 -2
  69. package/dist/handlers/message-handlers/challenge-handler.js.map +1 -1
  70. package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
  71. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  72. package/dist/handlers/message-handlers/error-message-handler.js +2 -5
  73. package/dist/handlers/message-handlers/error-message-handler.js.map +1 -1
  74. package/dist/handlers/message-handlers/index.d.ts +11 -0
  75. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  76. package/dist/handlers/message-handlers/index.js +55 -1
  77. package/dist/handlers/message-handlers/index.js.map +1 -1
  78. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +1660 -0
  79. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
  80. package/dist/handlers/message-handlers/list-available-agents-handler.js +35 -0
  81. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
  82. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +1669 -0
  83. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
  84. package/dist/handlers/message-handlers/list-room-agents-handler.js +48 -0
  85. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
  86. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +2 -110
  87. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  88. package/dist/handlers/message-handlers/list-rooms-response-handler.js +4 -6
  89. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
  90. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
  91. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  92. package/dist/handlers/message-handlers/ping-pong-handler.js +4 -10
  93. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
  94. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts +94 -0
  95. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -0
  96. package/dist/handlers/message-handlers/rate-limit-notification-handler.js +35 -0
  97. package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -0
  98. package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
  99. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  100. package/dist/handlers/message-handlers/regular-message-handler.js +4 -6
  101. package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
  102. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
  103. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
  104. package/dist/handlers/message-handlers/room-operation-response-handler.js +89 -0
  105. package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
  106. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
  107. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  108. package/dist/handlers/message-handlers/subscribe-response-handler.js +4 -6
  109. package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -1
  110. package/dist/handlers/message-handlers/task-quote-handler.d.ts +14 -0
  111. package/dist/handlers/message-handlers/task-quote-handler.d.ts.map +1 -0
  112. package/dist/handlers/message-handlers/task-quote-handler.js +29 -0
  113. package/dist/handlers/message-handlers/task-quote-handler.js.map +1 -0
  114. package/dist/handlers/message-handlers/task-response-handler.js +2 -5
  115. package/dist/handlers/message-handlers/task-response-handler.js.map +1 -1
  116. package/dist/handlers/message-handlers/types.d.ts +21 -7
  117. package/dist/handlers/message-handlers/types.d.ts.map +1 -1
  118. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
  119. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  120. package/dist/handlers/message-handlers/unsubscribe-response-handler.js +4 -6
  121. package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -1
  122. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts +40 -0
  123. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts.map +1 -0
  124. package/dist/handlers/message-handlers/user-authenticated-handler.js +28 -0
  125. package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -0
  126. package/dist/handlers/message-handlers/user-count-handler.d.ts +49 -0
  127. package/dist/handlers/message-handlers/user-count-handler.d.ts.map +1 -0
  128. package/dist/handlers/message-handlers/user-count-handler.js +31 -0
  129. package/dist/handlers/message-handlers/user-count-handler.js.map +1 -0
  130. package/dist/handlers/webhook-handler.d.ts +1 -1
  131. package/dist/handlers/webhook-handler.d.ts.map +1 -1
  132. package/dist/handlers/webhook-handler.js +14 -5
  133. package/dist/handlers/webhook-handler.js.map +1 -1
  134. package/dist/index.d.ts +6 -1
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +19 -2
  137. package/dist/index.js.map +1 -1
  138. package/dist/managers/admin-manager.d.ts +116 -0
  139. package/dist/managers/admin-manager.d.ts.map +1 -0
  140. package/dist/managers/admin-manager.js +169 -0
  141. package/dist/managers/admin-manager.js.map +1 -0
  142. package/dist/managers/agent-registry.d.ts +52 -1
  143. package/dist/managers/agent-registry.d.ts.map +1 -1
  144. package/dist/managers/agent-registry.js +145 -6
  145. package/dist/managers/agent-registry.js.map +1 -1
  146. package/dist/managers/agent-room-manager.d.ts +216 -0
  147. package/dist/managers/agent-room-manager.d.ts.map +1 -0
  148. package/dist/managers/agent-room-manager.js +555 -0
  149. package/dist/managers/agent-room-manager.js.map +1 -0
  150. package/dist/managers/connection-manager.js +2 -0
  151. package/dist/managers/connection-manager.js.map +1 -1
  152. package/dist/managers/index.d.ts +4 -1
  153. package/dist/managers/index.d.ts.map +1 -1
  154. package/dist/managers/index.js +7 -1
  155. package/dist/managers/index.js.map +1 -1
  156. package/dist/managers/message-router.d.ts +56 -5
  157. package/dist/managers/message-router.d.ts.map +1 -1
  158. package/dist/managers/message-router.js +155 -8
  159. package/dist/managers/message-router.js.map +1 -1
  160. package/dist/managers/room-management-manager.d.ts +213 -0
  161. package/dist/managers/room-management-manager.d.ts.map +1 -0
  162. package/dist/managers/room-management-manager.js +442 -0
  163. package/dist/managers/room-management-manager.js.map +1 -0
  164. package/dist/managers/room-manager.d.ts +11 -9
  165. package/dist/managers/room-manager.d.ts.map +1 -1
  166. package/dist/managers/room-manager.js +14 -10
  167. package/dist/managers/room-manager.js.map +1 -1
  168. package/dist/payments/index.d.ts +5 -0
  169. package/dist/payments/index.d.ts.map +1 -0
  170. package/dist/payments/index.js +21 -0
  171. package/dist/payments/index.js.map +1 -0
  172. package/dist/payments/payment-client.d.ts +74 -0
  173. package/dist/payments/payment-client.d.ts.map +1 -0
  174. package/dist/payments/payment-client.js +207 -0
  175. package/dist/payments/payment-client.js.map +1 -0
  176. package/dist/teneo-sdk.d.ts +467 -33
  177. package/dist/teneo-sdk.d.ts.map +1 -1
  178. package/dist/teneo-sdk.js +735 -26
  179. package/dist/teneo-sdk.js.map +1 -1
  180. package/dist/types/categories.d.ts +22 -0
  181. package/dist/types/categories.d.ts.map +1 -0
  182. package/dist/types/categories.js +40 -0
  183. package/dist/types/categories.js.map +1 -0
  184. package/dist/types/config.d.ts +134 -54
  185. package/dist/types/config.d.ts.map +1 -1
  186. package/dist/types/config.js +70 -9
  187. package/dist/types/config.js.map +1 -1
  188. package/dist/types/error-codes.d.ts +10 -0
  189. package/dist/types/error-codes.d.ts.map +1 -1
  190. package/dist/types/error-codes.js +12 -0
  191. package/dist/types/error-codes.js.map +1 -1
  192. package/dist/types/events.d.ts +176 -68
  193. package/dist/types/events.d.ts.map +1 -1
  194. package/dist/types/events.js +19 -1
  195. package/dist/types/events.js.map +1 -1
  196. package/dist/types/index.d.ts +3 -2
  197. package/dist/types/index.d.ts.map +1 -1
  198. package/dist/types/index.js +57 -2
  199. package/dist/types/index.js.map +1 -1
  200. package/dist/types/messages.d.ts +22225 -2592
  201. package/dist/types/messages.d.ts.map +1 -1
  202. package/dist/types/messages.js +537 -28
  203. package/dist/types/messages.js.map +1 -1
  204. package/dist/utils/bounded-queue.d.ts.map +1 -1
  205. package/dist/utils/bounded-queue.js +5 -2
  206. package/dist/utils/bounded-queue.js.map +1 -1
  207. package/dist/utils/circuit-breaker.js +11 -4
  208. package/dist/utils/circuit-breaker.js.map +1 -1
  209. package/dist/utils/deduplication-cache.js +3 -1
  210. package/dist/utils/deduplication-cache.js.map +1 -1
  211. package/dist/utils/event-waiter.d.ts +3 -3
  212. package/dist/utils/event-waiter.d.ts.map +1 -1
  213. package/dist/utils/index.d.ts +1 -0
  214. package/dist/utils/index.d.ts.map +1 -1
  215. package/dist/utils/index.js +4 -1
  216. package/dist/utils/index.js.map +1 -1
  217. package/dist/utils/logger.js.map +1 -1
  218. package/dist/utils/pricing-resolver.d.ts +26 -0
  219. package/dist/utils/pricing-resolver.d.ts.map +1 -0
  220. package/dist/utils/pricing-resolver.js +85 -0
  221. package/dist/utils/pricing-resolver.js.map +1 -0
  222. package/dist/utils/rate-limiter.d.ts.map +1 -1
  223. package/dist/utils/rate-limiter.js +6 -0
  224. package/dist/utils/rate-limiter.js.map +1 -1
  225. package/dist/utils/retry-policy.js +1 -0
  226. package/dist/utils/retry-policy.js.map +1 -1
  227. package/dist/utils/secure-private-key.js +3 -1
  228. package/dist/utils/secure-private-key.js.map +1 -1
  229. package/dist/utils/signature-verifier.d.ts.map +1 -1
  230. package/dist/utils/signature-verifier.js +3 -1
  231. package/dist/utils/signature-verifier.js.map +1 -1
  232. package/examples/.env.example +2 -2
  233. package/examples/agent-room-management-example.ts +335 -0
  234. package/examples/basic-usage.ts +3 -4
  235. package/examples/claude-agent-x-follower/.env.example +3 -3
  236. package/examples/claude-agent-x-follower/QUICKSTART.md +3 -3
  237. package/examples/claude-agent-x-follower/README.md +3 -3
  238. package/examples/claude-agent-x-follower/index.ts +120 -96
  239. package/examples/n8n-teneo/.env.example +3 -3
  240. package/examples/n8n-teneo/README.md +2 -2
  241. package/examples/n8n-teneo/index.ts +54 -44
  242. package/examples/nestjs-dashboard/.env.example +11 -0
  243. package/examples/nestjs-dashboard/README.md +297 -0
  244. package/examples/nestjs-dashboard/nest-cli.json +10 -0
  245. package/examples/nestjs-dashboard/package.json +44 -0
  246. package/examples/nestjs-dashboard/pnpm-lock.yaml +3079 -0
  247. package/examples/nestjs-dashboard/src/app.controller.ts +24 -0
  248. package/examples/nestjs-dashboard/src/app.module.ts +15 -0
  249. package/examples/nestjs-dashboard/src/main.ts +32 -0
  250. package/examples/nestjs-dashboard/src/public/dashboard.html +1144 -0
  251. package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +54 -0
  252. package/examples/nestjs-dashboard/src/teneo/events.controller.ts +65 -0
  253. package/examples/nestjs-dashboard/src/teneo/messages.controller.ts +47 -0
  254. package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +258 -0
  255. package/examples/nestjs-dashboard/src/teneo/teneo.module.ts +13 -0
  256. package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +484 -0
  257. package/examples/nestjs-dashboard/tsconfig.json +22 -0
  258. package/examples/openai-teneo/.env.example +3 -3
  259. package/examples/openai-teneo/README.md +3 -3
  260. package/examples/openai-teneo/index.ts +82 -71
  261. package/examples/production-dashboard/.env.example +3 -3
  262. package/examples/production-dashboard/README.md +90 -13
  263. package/examples/production-dashboard/public/dashboard.html +1173 -601
  264. package/examples/production-dashboard/server.ts +349 -7
  265. package/examples/room-management-example.ts +282 -0
  266. package/examples/usage/.env.example +2 -2
  267. package/examples/usage/01-connect.ts +3 -4
  268. package/examples/usage/02-list-agents.ts +2 -3
  269. package/examples/usage/03-pick-agent.ts +2 -3
  270. package/examples/usage/04-find-by-capability.ts +2 -3
  271. package/examples/usage/05-webhook-example.ts +2 -3
  272. package/examples/usage/06-simple-api-server.ts +2 -3
  273. package/examples/usage/07-event-listener.ts +2 -3
  274. package/examples/usage/README.md +1 -1
  275. package/examples/webhook-integration.ts +1 -1
  276. package/examples/x-influencer-battle-server.ts +2 -2
  277. package/package.json +12 -1
  278. package/src/core/websocket-client.test.ts +8 -3
  279. package/src/core/websocket-client.ts +58 -4
  280. package/src/formatters/response-formatter.test.ts +2 -0
  281. package/src/formatters/response-formatter.ts +3 -3
  282. package/src/handlers/message-handlers/agent-details-response-handler.ts +42 -0
  283. package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +77 -0
  284. package/src/handlers/message-handlers/agent-status-update-handler.ts +52 -0
  285. package/src/handlers/message-handlers/all-agents-response-handler.ts +39 -0
  286. package/src/handlers/message-handlers/auth-message-handler.ts +78 -5
  287. package/src/handlers/message-handlers/auth-success-handler.ts +63 -6
  288. package/src/handlers/message-handlers/base-handler.ts +20 -7
  289. package/src/handlers/message-handlers/index.ts +53 -0
  290. package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
  291. package/src/handlers/message-handlers/list-room-agents-handler.ts +58 -0
  292. package/src/handlers/message-handlers/list-rooms-response-handler.ts +4 -2
  293. package/src/handlers/message-handlers/rate-limit-notification-handler.ts +45 -0
  294. package/src/handlers/message-handlers/regular-message-handler.ts +3 -2
  295. package/src/handlers/message-handlers/room-operation-response-handler.ts +102 -0
  296. package/src/handlers/message-handlers/subscribe-response-handler.ts +12 -2
  297. package/src/handlers/message-handlers/task-quote-handler.ts +31 -0
  298. package/src/handlers/message-handlers/types.ts +41 -7
  299. package/src/handlers/message-handlers/unsubscribe-response-handler.ts +12 -2
  300. package/src/handlers/message-handlers/user-authenticated-handler.ts +31 -0
  301. package/src/handlers/message-handlers/user-count-handler.ts +34 -0
  302. package/src/handlers/webhook-handler.test.ts +3 -2
  303. package/src/handlers/webhook-handler.ts +13 -7
  304. package/src/index.ts +21 -0
  305. package/src/managers/admin-manager.ts +249 -0
  306. package/src/managers/agent-registry.test.ts +2 -1
  307. package/src/managers/agent-registry.ts +170 -2
  308. package/src/managers/agent-room-manager.ts +665 -0
  309. package/src/managers/index.ts +15 -1
  310. package/src/managers/message-router.ts +215 -17
  311. package/src/managers/room-management-manager.ts +520 -0
  312. package/src/managers/room-manager.ts +15 -20
  313. package/src/payments/index.ts +22 -0
  314. package/src/payments/payment-client.ts +240 -0
  315. package/src/teneo-sdk.ts +806 -30
  316. package/src/types/categories.ts +45 -0
  317. package/src/types/config.ts +80 -7
  318. package/src/types/error-codes.ts +14 -0
  319. package/src/types/events.test.ts +1 -0
  320. package/src/types/events.ts +67 -0
  321. package/src/types/index.ts +111 -0
  322. package/src/types/messages.test.ts +2 -1
  323. package/src/types/messages.ts +677 -42
  324. package/src/utils/bounded-queue.test.ts +1 -1
  325. package/src/utils/bounded-queue.ts +2 -1
  326. package/src/utils/circuit-breaker.test.ts +1 -1
  327. package/src/utils/deduplication-cache.test.ts +1 -1
  328. package/src/utils/event-waiter.test.ts +1 -1
  329. package/src/utils/event-waiter.ts +3 -3
  330. package/src/utils/index.ts +7 -0
  331. package/src/utils/logger.ts +8 -8
  332. package/src/utils/pricing-resolver.ts +128 -0
  333. package/src/utils/rate-limiter.test.ts +1 -1
  334. package/src/utils/rate-limiter.ts +1 -0
  335. package/src/utils/signature-verifier.test.ts +2 -2
  336. package/src/utils/signature-verifier.ts +3 -2
  337. package/tests/.env.example +7 -0
  338. package/tests/direct-agent-test.ts +151 -0
  339. package/tests/integration/real-server.test.ts +2 -0
  340. package/tests/integration/room-management.test.ts +516 -0
  341. package/tests/integration/websocket.test.ts +5 -2
  342. package/tests/payment-flow-test.ts +147 -0
  343. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +382 -0
  344. package/tests/unit/handlers/agent-status-update-handler.test.ts +403 -0
  345. package/tests/unit/handlers/auth-success-handler-rooms.test.ts +697 -0
  346. package/tests/unit/handlers/list-available-agents-handler.test.ts +248 -0
  347. package/tests/unit/handlers/list-room-agents-handler.test.ts +290 -0
  348. package/tests/unit/handlers/room-operation-response-handler.test.ts +500 -0
  349. package/tests/unit/managers/agent-room-manager.test.ts +527 -0
  350. package/tests/unit/managers/room-management-manager.test.ts +420 -0
  351. package/tsconfig.json +2 -2
  352. package/vitest.config.ts +1 -0
@@ -16,6 +16,14 @@
16
16
  * - Real-time event streaming
17
17
  * - Complete error handling
18
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
+ *
19
27
  * Run with: bun run server.ts
20
28
  */
21
29
 
@@ -28,11 +36,9 @@ import { SDKConfigBuilder, TeneoSDK, SecurePrivateKey } from "../../dist/index.j
28
36
 
29
37
  // Load environment variables
30
38
  const PORT = parseInt(process.env.PORT || "3001");
31
- const WS_URL =
32
- process.env.WS_URL || "wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws";
39
+ const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
33
40
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
34
41
  const WALLET_ADDRESS = process.env.WALLET_ADDRESS || "";
35
- const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "as1LfBarJNzOIpOQJQ7PH";
36
42
  const ENABLE_SIG_VERIFICATION = process.env.ENABLE_SIGNATURE_VERIFICATION === "true";
37
43
  const TRUSTED_ADDRESSES = process.env.TRUSTED_ADDRESSES?.split(",").filter(Boolean) || [];
38
44
 
@@ -75,7 +81,6 @@ async function initializeSDK() {
75
81
  const config = new SDKConfigBuilder()
76
82
  .withWebSocketUrl(WS_URL)
77
83
  .withAuthentication(secureKey, WALLET_ADDRESS) // Pass SecurePrivateKey instead of plain string
78
- .withAutoJoinRooms([DEFAULT_ROOM])
79
84
  .withReconnection({ enabled: true, delay: 5000, maxAttempts: 10 })
80
85
  // REL-3: Configure custom retry strategies for production resilience
81
86
  .withReconnectionStrategy({
@@ -125,8 +130,8 @@ async function initializeSDK() {
125
130
  // Set up comprehensive event listeners
126
131
  setupSDKEventListeners(sdk);
127
132
 
128
- // Connect to Teneo network
129
- console.log("[SDK] Connecting to Teneo network...");
133
+ // Connect to Teneo Protocol
134
+ console.log("[SDK] Connecting to Teneo Protocol...");
130
135
  await sdk.connect();
131
136
  console.log("[SDK] Successfully connected and authenticated!");
132
137
 
@@ -257,6 +262,81 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
257
262
  broadcastSSE({ type: "room:list", rooms });
258
263
  });
259
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
+
260
340
  // Webhook events
261
341
  sdk.on("webhook:sent", (payload, url) => {
262
342
  addEvent("webhook:sent", { event: payload.event, url });
@@ -594,7 +674,7 @@ app.get("/api/rooms", (c) => {
594
674
  return c.json(rooms);
595
675
  });
596
676
 
597
- // Get available rooms for sending messages (subscribed + private room)
677
+ // Get available rooms for sending messages (subscribed + private room + owned rooms)
598
678
  app.get("/api/rooms/available", (c) => {
599
679
  if (!sdk) {
600
680
  return c.json({ error: "SDK not initialized" }, 503);
@@ -602,6 +682,8 @@ app.get("/api/rooms/available", (c) => {
602
682
 
603
683
  const authState = sdk.getAuthState();
604
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
605
687
 
606
688
  // Combine all available rooms
607
689
  const availableRooms: Array<{
@@ -637,6 +719,36 @@ app.get("/api/rooms/available", (c) => {
637
719
  });
638
720
  }
639
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
+
640
752
  // Add private room ID if not already included
641
753
  if (authState.privateRoomId && !availableRooms.find((r) => r.id === authState.privateRoomId)) {
642
754
  availableRooms.push({
@@ -703,6 +815,236 @@ app.post("/api/room/leave", async (c) => {
703
815
  }
704
816
  });
705
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
+
706
1048
  // Get recent events
707
1049
  app.get("/api/events", (c) => {
708
1050
  return c.json(recentEvents.slice(0, 50));
@@ -0,0 +1,282 @@
1
+ /**
2
+ * Room Management Example
3
+ *
4
+ * Demonstrates how to create, manage, and organize multiple rooms in the Teneo SDK v2.0.
5
+ *
6
+ * This example shows:
7
+ * - Creating rooms with different configurations
8
+ * - Checking room limits and quotas
9
+ * - Querying owned vs shared rooms
10
+ * - Updating room properties
11
+ * - Deleting rooms
12
+ * - Handling room events
13
+ *
14
+ * Prerequisites:
15
+ * - Set TENEO_WS_URL environment variable
16
+ * - Set PRIVATE_KEY environment variable (64 hex characters, no 0x prefix)
17
+ *
18
+ * Run:
19
+ * npx ts-node examples/room-management-example.ts
20
+ */
21
+
22
+ import { TeneoSDK } from "../src";
23
+ import * as dotenv from "dotenv";
24
+
25
+ dotenv.config();
26
+
27
+ const wsUrl = process.env.TENEO_WS_URL!;
28
+ const privateKey = process.env.PRIVATE_KEY!;
29
+
30
+ async function main() {
31
+ console.log("🚀 Teneo SDK v2.0 - Room Management Example\n");
32
+
33
+ // Initialize SDK
34
+ const sdk = new TeneoSDK({
35
+ wsUrl,
36
+ privateKey,
37
+ logLevel: "info",
38
+ reconnect: true
39
+ });
40
+
41
+ // Set up event listeners for room operations
42
+ setupEventListeners(sdk);
43
+
44
+ try {
45
+ // Connect and authenticate
46
+ console.log("📡 Connecting to Teneo Protocol...");
47
+ await sdk.connect();
48
+ console.log("✅ Connected and authenticated\n");
49
+
50
+ // Wait a moment for initial room data to load
51
+ await new Promise((resolve) => setTimeout(resolve, 1000));
52
+
53
+ // Step 1: Check current room status
54
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
55
+ console.log("📊 Current Room Status");
56
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
57
+ await displayRoomStatus(sdk);
58
+
59
+ // Step 2: Create new rooms
60
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
61
+ console.log("🏗️ Creating New Rooms");
62
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
63
+ const newRooms = await createSampleRooms(sdk);
64
+
65
+ // Wait for room creation events to process
66
+ await new Promise((resolve) => setTimeout(resolve, 500));
67
+
68
+ // Step 3: Display updated room status
69
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
70
+ console.log("📊 Updated Room Status");
71
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
72
+ await displayRoomStatus(sdk);
73
+
74
+ // Step 4: Update a room
75
+ if (newRooms.length > 0) {
76
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
77
+ console.log("📝 Updating Room");
78
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
79
+ await updateRoomExample(sdk, newRooms[0].id);
80
+ }
81
+
82
+ // Step 5: Query specific room
83
+ if (newRooms.length > 0) {
84
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
85
+ console.log("🔍 Querying Specific Room");
86
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
87
+ const room = sdk.getRoomById(newRooms[0].id);
88
+ if (room) {
89
+ console.log(`Room ID: ${room.id}`);
90
+ console.log(`Name: ${room.name}`);
91
+ console.log(`Description: ${room.description || "N/A"}`);
92
+ console.log(`Type: ${room.is_public ? "Public" : "Private"}`);
93
+ console.log(`Created by: ${room.created_by}`);
94
+ console.log(`Created at: ${room.created_at}`);
95
+ console.log(`You are: ${room.is_owner ? "Owner" : "Member"}`);
96
+ }
97
+ }
98
+
99
+ // Step 6: Delete rooms
100
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
101
+ console.log("🗑️ Cleaning Up (Deleting Rooms)");
102
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
103
+ await deleteRooms(sdk, newRooms);
104
+
105
+ // Wait for deletion events to process
106
+ await new Promise((resolve) => setTimeout(resolve, 500));
107
+
108
+ // Step 7: Final room status
109
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
110
+ console.log("📊 Final Room Status");
111
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
112
+ await displayRoomStatus(sdk);
113
+
114
+ console.log("\n✅ Room management example completed!");
115
+ } catch (error: any) {
116
+ console.error("\n❌ Error:", error.message);
117
+ console.error(error.stack);
118
+ } finally {
119
+ // Disconnect
120
+ console.log("\n👋 Disconnecting...");
121
+ sdk.disconnect();
122
+ console.log("✅ Disconnected");
123
+ }
124
+ }
125
+
126
+ function setupEventListeners(sdk: TeneoSDK) {
127
+ // Room created
128
+ sdk.on("room:created", (room) => {
129
+ console.log(` ✅ Room created: "${room.name}" (${room.id})`);
130
+ });
131
+
132
+ // Room updated
133
+ sdk.on("room:updated", (room) => {
134
+ console.log(` ✅ Room updated: "${room.name}" (${room.id})`);
135
+ });
136
+
137
+ // Room deleted
138
+ sdk.on("room:deleted", (roomId) => {
139
+ console.log(` ✅ Room deleted: ${roomId}`);
140
+ });
141
+
142
+ // Room errors
143
+ sdk.on("room:create_error", (error) => {
144
+ console.error(` ❌ Failed to create room: ${error.message}`);
145
+ });
146
+
147
+ sdk.on("room:update_error", (error, roomId) => {
148
+ console.error(` ❌ Failed to update room ${roomId}: ${error.message}`);
149
+ });
150
+
151
+ sdk.on("room:delete_error", (error, roomId) => {
152
+ console.error(` ❌ Failed to delete room ${roomId}: ${error.message}`);
153
+ });
154
+ }
155
+
156
+ async function displayRoomStatus(sdk: TeneoSDK) {
157
+ const ownedRooms = sdk.getOwnedRooms();
158
+ const sharedRooms = sdk.getSharedRooms();
159
+ const roomLimit = sdk.getRoomLimit();
160
+ const roomCount = sdk.getOwnedRoomCount();
161
+
162
+ console.log(`Room Capacity: ${roomCount}/${roomLimit} rooms used`);
163
+ console.log(`Can create more rooms: ${sdk.canCreateRoom() ? "✅ Yes" : "❌ No (limit reached)"}`);
164
+
165
+ console.log(`\n📁 Owned Rooms (${ownedRooms.length}):`);
166
+ if (ownedRooms.length === 0) {
167
+ console.log(" (none)");
168
+ } else {
169
+ ownedRooms.forEach((room, i) => {
170
+ console.log(` ${i + 1}. "${room.name}" - ${room.is_public ? "Public" : "Private"}`);
171
+ console.log(` ID: ${room.id}`);
172
+ if (room.description) {
173
+ console.log(` Description: ${room.description}`);
174
+ }
175
+ });
176
+ }
177
+
178
+ console.log(`\n🤝 Shared Rooms (${sharedRooms.length}):`);
179
+ if (sharedRooms.length === 0) {
180
+ console.log(" (none)");
181
+ } else {
182
+ sharedRooms.forEach((room, i) => {
183
+ console.log(` ${i + 1}. "${room.name}" - ${room.is_public ? "Public" : "Private"}`);
184
+ console.log(` ID: ${room.id}`);
185
+ console.log(` Created by: ${room.created_by}`);
186
+ });
187
+ }
188
+ }
189
+
190
+ async function createSampleRooms(sdk: TeneoSDK) {
191
+ const newRooms = [];
192
+
193
+ // Check if we can create rooms
194
+ if (!sdk.canCreateRoom()) {
195
+ console.log("⚠️ Cannot create rooms - limit reached");
196
+ console.log(` Current: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
197
+ return newRooms;
198
+ }
199
+
200
+ try {
201
+ // Create room 1: Private crypto research room
202
+ console.log("Creating 'Crypto Research' room...");
203
+ const cryptoRoom = await sdk.createRoom({
204
+ name: "Crypto Research",
205
+ description: "Room for cryptocurrency analysis and tracking",
206
+ isPublic: false
207
+ });
208
+ newRooms.push(cryptoRoom);
209
+
210
+ // Create room 2: Public gaming room (if we have capacity)
211
+ if (sdk.canCreateRoom()) {
212
+ console.log("Creating 'Gaming Hub' room...");
213
+ const gamingRoom = await sdk.createRoom({
214
+ name: "Gaming Hub",
215
+ description: "Public room for gaming-related AI agents",
216
+ isPublic: true
217
+ });
218
+ newRooms.push(gamingRoom);
219
+ }
220
+
221
+ // Create room 3: Research room (if we have capacity)
222
+ if (sdk.canCreateRoom()) {
223
+ console.log("Creating 'AI Research' room...");
224
+ const researchRoom = await sdk.createRoom({
225
+ name: "AI Research",
226
+ description: "Room for AI research and experimentation"
227
+ });
228
+ newRooms.push(researchRoom);
229
+ }
230
+ } catch (error: any) {
231
+ console.error(`Failed to create room: ${error.message}`);
232
+ }
233
+
234
+ return newRooms;
235
+ }
236
+
237
+ async function updateRoomExample(sdk: TeneoSDK, roomId: string) {
238
+ try {
239
+ const originalRoom = sdk.getRoomById(roomId);
240
+ if (!originalRoom) {
241
+ console.log(" ⚠️ Room not found");
242
+ return;
243
+ }
244
+
245
+ console.log(`Original room name: "${originalRoom.name}"`);
246
+ console.log(`Original description: "${originalRoom.description || "N/A"}"`);
247
+
248
+ console.log("\nUpdating room...");
249
+ const updatedRoom = await sdk.updateRoom(roomId, {
250
+ name: `${originalRoom.name} (Updated)`,
251
+ description: "This room was updated via the SDK v2.0 API"
252
+ });
253
+
254
+ console.log(`\nNew room name: "${updatedRoom.name}"`);
255
+ console.log(`New description: "${updatedRoom.description}"`);
256
+ } catch (error: any) {
257
+ console.error(`Failed to update room: ${error.message}`);
258
+ }
259
+ }
260
+
261
+ async function deleteRooms(sdk: TeneoSDK, rooms: any[]) {
262
+ if (rooms.length === 0) {
263
+ console.log("No rooms to delete");
264
+ return;
265
+ }
266
+
267
+ console.log(`Deleting ${rooms.length} room(s)...\n`);
268
+
269
+ for (const room of rooms) {
270
+ try {
271
+ console.log(`Deleting "${room.name}" (${room.id})...`);
272
+ await sdk.deleteRoom(room.id);
273
+ // Wait a bit between deletions
274
+ await new Promise((resolve) => setTimeout(resolve, 300));
275
+ } catch (error: any) {
276
+ console.error(`Failed to delete room ${room.id}: ${error.message}`);
277
+ }
278
+ }
279
+ }
280
+
281
+ // Run the example
282
+ main().catch(console.error);