@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
@@ -5,31 +5,38 @@
5
5
  * Uses the OpenAI Codex SDK for thread-based conversations.
6
6
  */
7
7
 
8
- import 'dotenv/config';
9
- import express, { Request, Response } from 'express';
10
- import { Codex } from '@openai/codex-sdk';
11
- import { SDKConfigBuilder, TeneoSDK } from '../../dist/index.js';
8
+ import "dotenv/config";
9
+ import express, { Request, Response } from "express";
10
+ import { Codex } from "@openai/codex-sdk";
11
+ import { SDKConfigBuilder, TeneoSDK } from "../../dist/index.js";
12
12
 
13
13
  // Load environment variables
14
- const WS_URL = process.env.WS_URL || '';
15
- const PRIVATE_KEY = process.env.PRIVATE_KEY || '';
16
- const WALLET_ADDRESS = process.env.WALLET_ADDRESS || '';
17
- const DEFAULT_ROOM = process.env.DEFAULT_ROOM || 'general';
18
- const LOG_LEVEL = (process.env.LOG_LEVEL || 'info') as 'debug' | 'info' | 'warn' | 'error' | 'silent';
19
- const ENABLE_SIG_VERIFICATION = process.env.ENABLE_SIGNATURE_VERIFICATION === 'true';
20
- const TRUSTED_ADDRESSES = process.env.TRUSTED_ADDRESSES?.split(',').filter(Boolean) || [];
21
- const ENABLE_CACHE = process.env.ENABLE_CACHE !== 'false';
22
- const CACHE_TIMEOUT = parseInt(process.env.CACHE_TIMEOUT || '300000');
23
- const MAX_CACHE_SIZE = parseInt(process.env.MAX_CACHE_SIZE || '100');
24
- const ENABLE_RECONNECTION = process.env.ENABLE_RECONNECTION !== 'false';
25
- const RECONNECT_DELAY = parseInt(process.env.RECONNECT_DELAY || '5000');
26
- const MAX_RECONNECT_ATTEMPTS = parseInt(process.env.MAX_RECONNECT_ATTEMPTS || '10');
27
- const OPENAI_API_KEY = process.env.OPENAI_API_KEY || '';
14
+ const WS_URL = process.env.WS_URL || "";
15
+ const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
16
+ const WALLET_ADDRESS = process.env.WALLET_ADDRESS || "";
17
+ const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
18
+ const LOG_LEVEL = (process.env.LOG_LEVEL || "info") as
19
+ | "debug"
20
+ | "info"
21
+ | "warn"
22
+ | "error"
23
+ | "silent";
24
+ const ENABLE_SIG_VERIFICATION = process.env.ENABLE_SIGNATURE_VERIFICATION === "true";
25
+ const TRUSTED_ADDRESSES = process.env.TRUSTED_ADDRESSES?.split(",").filter(Boolean) || [];
26
+ const ENABLE_CACHE = process.env.ENABLE_CACHE !== "false";
27
+ const CACHE_TIMEOUT = parseInt(process.env.CACHE_TIMEOUT || "300000");
28
+ const MAX_CACHE_SIZE = parseInt(process.env.MAX_CACHE_SIZE || "100");
29
+ const ENABLE_RECONNECTION = process.env.ENABLE_RECONNECTION !== "false";
30
+ const RECONNECT_DELAY = parseInt(process.env.RECONNECT_DELAY || "5000");
31
+ const MAX_RECONNECT_ATTEMPTS = parseInt(process.env.MAX_RECONNECT_ATTEMPTS || "10");
32
+ const OPENAI_API_KEY = process.env.OPENAI_API_KEY || "";
28
33
 
29
34
  // Validate required environment variables
30
35
  if (!WS_URL || !PRIVATE_KEY) {
31
- console.error('Missing required environment variables: WS_URL, PRIVATE_KEY');
32
- console.error('Note: OPENAI_API_KEY is optional - Codex SDK will use default auth if not provided');
36
+ console.error("Missing required environment variables: WS_URL, PRIVATE_KEY");
37
+ console.error(
38
+ "Note: OPENAI_API_KEY is optional - Codex SDK will use default auth if not provided"
39
+ );
33
40
  process.exit(1);
34
41
  }
35
42
 
@@ -39,20 +46,20 @@ app.use(express.json());
39
46
  // Initialize Teneo SDK using SDKConfigBuilder pattern
40
47
  const config = new SDKConfigBuilder()
41
48
  .withWebSocketUrl(WS_URL)
42
- .withAuthentication(PRIVATE_KEY, WALLET_ADDRESS) // Wallet auto-derived if not provided
49
+ .withAuthentication(PRIVATE_KEY, WALLET_ADDRESS) // Wallet auto-derived if not provided
43
50
  .withAutoJoinRooms([DEFAULT_ROOM])
44
51
  .withReconnection({
45
52
  enabled: ENABLE_RECONNECTION,
46
53
  delay: RECONNECT_DELAY,
47
54
  maxAttempts: MAX_RECONNECT_ATTEMPTS
48
55
  })
49
- .withResponseFormat({ format: 'both', includeMetadata: true })
56
+ .withResponseFormat({ format: "both", includeMetadata: true })
50
57
  .withLogging(LOG_LEVEL)
51
58
  .withCache(ENABLE_CACHE, CACHE_TIMEOUT, MAX_CACHE_SIZE)
52
59
  .withSignatureVerification({
53
60
  enabled: ENABLE_SIG_VERIFICATION,
54
61
  trustedAddresses: TRUSTED_ADDRESSES,
55
- requireFor: ['task_response', 'agent_selected'],
62
+ requireFor: ["task_response", "agent_selected"],
56
63
  strictMode: false
57
64
  })
58
65
  .build();
@@ -66,17 +73,17 @@ const codex = new Codex({
66
73
  });
67
74
 
68
75
  // Connect to Teneo
69
- console.log('📡 Connecting to Teneo network...');
76
+ console.log("📡 Connecting to Teneo Protocol...");
70
77
  await teneoSDK.connect();
71
- console.log('✅ Connected to Teneo\n');
78
+ console.log("✅ Connected to Teneo\n");
72
79
 
73
80
  // Health endpoint
74
- app.get('/health', (_req: Request, res: Response) => {
81
+ app.get("/health", (_req: Request, res: Response) => {
75
82
  const teneoHealth = teneoSDK.getHealth();
76
83
  res.json({
77
- status: 'ok',
84
+ status: "ok",
78
85
  teneo: {
79
- connected: teneoHealth.connection.status === 'connected',
86
+ connected: teneoHealth.connection.status === "connected",
80
87
  authenticated: teneoHealth.connection.authenticated
81
88
  },
82
89
  codex: {
@@ -87,14 +94,14 @@ app.get('/health', (_req: Request, res: Response) => {
87
94
  });
88
95
 
89
96
  // Query endpoint - Codex analyzes, then routes to Teneo agent
90
- app.post('/query', async (req: Request, res: Response) => {
97
+ app.post("/query", async (req: Request, res: Response) => {
91
98
  try {
92
99
  const { message } = req.body;
93
100
 
94
101
  if (!message) {
95
102
  return res.status(400).json({
96
103
  success: false,
97
- error: 'Message is required'
104
+ error: "Message is required"
98
105
  });
99
106
  }
100
107
 
@@ -104,11 +111,11 @@ app.post('/query', async (req: Request, res: Response) => {
104
111
  const agents = teneoSDK.getAgents();
105
112
 
106
113
  // Step 2: Ask Codex to select the best agent
107
- console.log('🤖 Asking Codex to select best agent...');
114
+ console.log("🤖 Asking Codex to select best agent...");
108
115
 
109
- const agentList = agents.map(a =>
110
- `- ${a.name}: ${a.description || 'No description'}`
111
- ).join('\n');
116
+ const agentList = agents
117
+ .map((a) => `- ${a.name}: ${a.description || "No description"}`)
118
+ .join("\n");
112
119
 
113
120
  const thread = codex.startThread();
114
121
  const codexResponse = await thread.run(
@@ -125,50 +132,55 @@ Respond with ONLY the agent name, nothing else.`
125
132
  // Extract text from Codex response
126
133
  // Codex SDK returns an object with finalResponse property
127
134
  let selectedAgentName: string;
128
- if (typeof codexResponse === 'string') {
135
+ if (typeof codexResponse === "string") {
129
136
  selectedAgentName = codexResponse.trim();
130
- } else if (codexResponse && typeof codexResponse === 'object') {
137
+ } else if (codexResponse && typeof codexResponse === "object") {
131
138
  // Extract from finalResponse property
132
- selectedAgentName = (codexResponse as any).finalResponse
133
- || (codexResponse as any).text
134
- || (codexResponse as any).content
135
- || String(codexResponse);
136
- if (typeof selectedAgentName === 'object') {
139
+ selectedAgentName =
140
+ (codexResponse as any).finalResponse ||
141
+ (codexResponse as any).text ||
142
+ (codexResponse as any).content ||
143
+ String(codexResponse);
144
+ if (typeof selectedAgentName === "object") {
137
145
  selectedAgentName = JSON.stringify(selectedAgentName);
138
146
  }
139
147
  selectedAgentName = selectedAgentName.trim();
140
148
  } else {
141
- selectedAgentName = agents[0]?.name || '';
149
+ selectedAgentName = agents[0]?.name || "";
142
150
  }
143
151
 
144
152
  console.log(`✅ Selected agent: ${selectedAgentName}`);
145
153
 
146
154
  // Find the agent by name or ID
147
- const selectedAgent = agents.find(a =>
148
- a.name?.toLowerCase() === selectedAgentName.toLowerCase() ||
149
- a.id?.toLowerCase() === selectedAgentName.toLowerCase()
155
+ const selectedAgent = agents.find(
156
+ (a) =>
157
+ a.name?.toLowerCase() === selectedAgentName.toLowerCase() ||
158
+ a.id?.toLowerCase() === selectedAgentName.toLowerCase()
150
159
  );
151
160
 
152
161
  if (!selectedAgent) {
153
162
  return res.status(404).json({
154
163
  success: false,
155
- error: `Agent '${selectedAgentName}' not found. Available agents: ${agents.map(a => a.name || a.id).join(', ')}`
164
+ error: `Agent '${selectedAgentName}' not found. Available agents: ${agents.map((a) => a.name || a.id).join(", ")}`
156
165
  });
157
166
  }
158
167
 
159
168
  // Step 3: Send direct command to selected Teneo agent (bypasses coordinator)
160
169
  // Use the SDK's built-in waitForResponse feature with the improved fallback matching
161
170
  console.log(`📤 Sending to Teneo agent: ${selectedAgent.name || selectedAgent.id}...`);
162
- const teneoResponse = await teneoSDK.sendDirectCommand({
163
- agent: selectedAgent.id,
164
- command: message,
165
- room: DEFAULT_ROOM
166
- }, true); // waitForResponse = true
171
+ const teneoResponse = await teneoSDK.sendDirectCommand(
172
+ {
173
+ agent: selectedAgent.id,
174
+ command: message,
175
+ room: DEFAULT_ROOM
176
+ },
177
+ true
178
+ ); // waitForResponse = true
167
179
 
168
180
  if (!teneoResponse || !teneoResponse.humanized) {
169
181
  return res.json({
170
182
  success: false,
171
- error: 'No response from Teneo agent'
183
+ error: "No response from Teneo agent"
172
184
  });
173
185
  }
174
186
 
@@ -186,25 +198,24 @@ Respond with ONLY the agent name, nothing else.`
186
198
  metadata: teneoResponse.metadata
187
199
  }
188
200
  });
189
-
190
201
  } catch (error) {
191
- console.error('❌ Query error:', error);
202
+ console.error("❌ Query error:", error);
192
203
  res.status(500).json({
193
204
  success: false,
194
- error: error instanceof Error ? error.message : 'Unknown error'
205
+ error: error instanceof Error ? error.message : "Unknown error"
195
206
  });
196
207
  }
197
208
  });
198
209
 
199
210
  // Direct Codex query (bypass Teneo)
200
- app.post('/codex', async (req: Request, res: Response) => {
211
+ app.post("/codex", async (req: Request, res: Response) => {
201
212
  try {
202
213
  const { message, threadId } = req.body;
203
214
 
204
215
  if (!message) {
205
216
  return res.status(400).json({
206
217
  success: false,
207
- error: 'Message is required'
218
+ error: "Message is required"
208
219
  });
209
220
  }
210
221
 
@@ -217,13 +228,14 @@ app.post('/codex', async (req: Request, res: Response) => {
217
228
  // Extract text from Codex response
218
229
  // Codex SDK returns an object with finalResponse property
219
230
  let responseText: string;
220
- if (typeof codexResult === 'string') {
231
+ if (typeof codexResult === "string") {
221
232
  responseText = codexResult;
222
- } else if (codexResult && typeof codexResult === 'object') {
223
- responseText = (codexResult as any).finalResponse
224
- || (codexResult as any).text
225
- || (codexResult as any).content
226
- || JSON.stringify(codexResult);
233
+ } else if (codexResult && typeof codexResult === "object") {
234
+ responseText =
235
+ (codexResult as any).finalResponse ||
236
+ (codexResult as any).text ||
237
+ (codexResult as any).content ||
238
+ JSON.stringify(codexResult);
227
239
  } else {
228
240
  responseText = String(codexResult);
229
241
  }
@@ -232,26 +244,25 @@ app.post('/codex', async (req: Request, res: Response) => {
232
244
  success: true,
233
245
  data: {
234
246
  response: responseText,
235
- threadId: thread.id || 'new',
247
+ threadId: thread.id || "new",
236
248
  usage: (codexResult as any).usage // Include token usage if available
237
249
  }
238
250
  });
239
-
240
251
  } catch (error) {
241
- console.error('❌ Codex error:', error);
252
+ console.error("❌ Codex error:", error);
242
253
  res.status(500).json({
243
254
  success: false,
244
- error: error instanceof Error ? error.message : 'Unknown error'
255
+ error: error instanceof Error ? error.message : "Unknown error"
245
256
  });
246
257
  }
247
258
  });
248
259
 
249
260
  // List Teneo agents
250
- app.get('/agents', (_req: Request, res: Response) => {
261
+ app.get("/agents", (_req: Request, res: Response) => {
251
262
  const agents = teneoSDK.getAgents();
252
263
  res.json({
253
264
  success: true,
254
- agents: agents.map(a => ({
265
+ agents: agents.map((a) => ({
255
266
  id: a.id,
256
267
  name: a.name,
257
268
  description: a.description,
@@ -272,8 +283,8 @@ app.listen(PORT, () => {
272
283
  });
273
284
 
274
285
  // Graceful shutdown
275
- process.on('SIGINT', () => {
276
- console.log('\n👋 Shutting down...');
286
+ process.on("SIGINT", () => {
287
+ console.log("\n👋 Shutting down...");
277
288
  teneoSDK.disconnect();
278
289
  teneoSDK.destroy();
279
290
  process.exit(0);
@@ -2,13 +2,13 @@
2
2
  # Copy this file to .env and fill in your values
3
3
 
4
4
  # ============================================================================
5
- # REQUIRED: Teneo Network Connection
5
+ # REQUIRED: Teneo Protocol Connection
6
6
  # ============================================================================
7
7
 
8
8
  # WebSocket URL for Teneo AI Network
9
9
  # Production: wss://your-production-server.com/ws
10
- # Development: wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws
11
- WS_URL=wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws
10
+ # Development: wss://your-teneo-server.com/ws
11
+ WS_URL=wss://your-teneo-server.com/ws
12
12
 
13
13
  # Ethereum Private Key (with 0x prefix)
14
14
  # IMPORTANT: Never commit your actual private key to version control!
@@ -11,7 +11,9 @@ This is the **ultimate reference implementation** showcasing every SDK capabilit
11
11
  ✅ **WebSocket Connection** - Auto-reconnection with exponential backoff
12
12
  ✅ **Ethereum Authentication** - Wallet-based authentication
13
13
  ✅ **Message Sending** - Coordinator-based and direct agent commands
14
- ✅ **Room Management** - Subscribe, unsubscribe, and list rooms
14
+ ✅ **Room Management (v1)** - Subscribe, unsubscribe, and list rooms
15
+ ✅ **Room Management (v2.0)** - Create, update, delete rooms with ownership tracking
16
+ ✅ **Agent-Room Management (v2.0)** - Add/remove agents per room, list room agents
15
17
  ✅ **Agent Discovery** - List agents with capabilities
16
18
  ✅ **Response Formatting** - Raw JSON, humanized text, or both
17
19
 
@@ -29,6 +31,17 @@ This is the **ultimate reference implementation** showcasing every SDK capabilit
29
31
  ✅ **Error Handling** - Custom error classes with recovery strategies
30
32
  ✅ **Event System** - Complete event-driven architecture
31
33
 
34
+ ### v2.0 Features (New!)
35
+
36
+ ✅ **Multi-Room Management** - Create, update, and delete your own rooms
37
+ ✅ **Room Ownership Tracking** - Distinguish between owned and shared rooms
38
+ ✅ **Room Limits** - Track and display room creation quotas
39
+ ✅ **Agent-Room Customization** - Add/remove agents per room (owner only)
40
+ ✅ **Room Agent Listing** - List agents in specific rooms with caching
41
+ ✅ **Available Agents** - See which agents can be added to a room
42
+ ✅ **Real-time Room Events** - Live updates for room creation/updates/deletions
43
+ ✅ **Real-time Agent-Room Events** - Live updates when agents are added/removed
44
+
32
45
  ### Production Features
33
46
 
34
47
  ✅ **Health Check Endpoint** - `/health` for Kubernetes/Docker monitoring
@@ -205,15 +218,46 @@ const config = new SDKConfigBuilder()
205
218
  - `GET /api/agents/search/capability/:capability` - **PERF-3**: Search by capability (O(1))
206
219
  - `GET /api/agents/search/name/:name` - **PERF-3**: Search by name (O(k))
207
220
  - `GET /api/agents/search/status/:status` - **PERF-3**: Search by status (O(1))
208
- - `GET /api/rooms` - List all available rooms
221
+ - `GET /api/rooms` - List all available rooms (v1)
209
222
  - `GET /api/deduplication` - **CB-4**: Get message deduplication status
210
- - `POST /api/room/subscribe` - Subscribe to a room
223
+ - `POST /api/room/subscribe` - Subscribe to a room (v1)
211
224
  ```json
212
225
  {
213
226
  "roomId": "tech-support"
214
227
  }
215
228
  ```
216
- - `POST /api/room/unsubscribe` - Unsubscribe from a room
229
+ - `POST /api/room/unsubscribe` - Unsubscribe from a room (v1)
230
+
231
+ ### Room Management v2.0 API
232
+
233
+ - `GET /api/v2/rooms/owned` - Get all rooms you own
234
+ - `GET /api/v2/rooms/shared` - Get all rooms you're a member of
235
+ - `GET /api/v2/rooms/limit` - Get your room creation limit
236
+ - `POST /api/v2/rooms` - Create a new room
237
+ ```json
238
+ {
239
+ "name": "My Room",
240
+ "description": "Optional description"
241
+ }
242
+ ```
243
+ - `PUT /api/v2/rooms/:id` - Update room (owner only)
244
+ ```json
245
+ {
246
+ "name": "Updated Name",
247
+ "description": "New description"
248
+ }
249
+ ```
250
+ - `DELETE /api/v2/rooms/:id` - Delete room (owner only)
251
+
252
+ ### Agent-Room Management v2.0 API
253
+
254
+ - `GET /api/v2/rooms/:id/agents` - List agents in room (with 5-min cache)
255
+ - `GET /api/v2/rooms/:id/available-agents` - List agents available to add
256
+ - `GET /api/v2/rooms/:id/agents/count` - Get agent count (instant, from cache)
257
+ - `GET /api/v2/rooms/:roomId/agents/:agentId/check` - Check if agent is in room
258
+ - `POST /api/v2/rooms/:roomId/agents/:agentId` - Add agent to room (owner only)
259
+ - `DELETE /api/v2/rooms/:roomId/agents/:agentId` - Remove agent from room (owner only)
260
+ - `POST /api/v2/rooms/:id/cache/invalidate` - Manually invalidate agent-room cache
217
261
 
218
262
  ### Real-time Data
219
263
 
@@ -240,10 +284,12 @@ const config = new SDKConfigBuilder()
240
284
  ### Tabs
241
285
 
242
286
  1. **Agents Tab**: List all agents with capabilities and status
243
- 2. **Rooms Tab**: Manage room subscriptions (subscribe/unsubscribe)
244
- 3. **Messages Tab**: View message history with responses
245
- 4. **Webhooks Tab**: Monitor received webhooks
246
- 5. **Events Tab**: Real-time event stream
287
+ 2. **Rooms Tab**: Manage room subscriptions (subscribe/unsubscribe) - v1
288
+ 3. **Room Mgmt Tab** 🆕: Create, update, delete rooms - View owned/shared rooms with room limits (v2.0)
289
+ 4. **Agent-Room Tab** 🆕: Add/remove agents to rooms - List room agents and available agents (v2.0)
290
+ 5. **Messages Tab**: View message history with responses
291
+ 6. **Webhooks Tab**: Monitor received webhooks
292
+ 7. **Events Tab**: Real-time event stream (includes v2.0 room and agent-room events)
247
293
 
248
294
  ### Health Monitor
249
295
 
@@ -265,18 +311,18 @@ import { SecurePrivateKey } from "@teneo-protocol/sdk";
265
311
  const secureKey = new SecurePrivateKey(process.env.PRIVATE_KEY);
266
312
 
267
313
  // Use with SDK - automatically decrypted when needed
268
- const config = new SDKConfigBuilder()
269
- .withAuthentication(secureKey, WALLET_ADDRESS)
270
- .build();
314
+ const config = new SDKConfigBuilder().withAuthentication(secureKey, WALLET_ADDRESS).build();
271
315
  ```
272
316
 
273
317
  **Security Benefits:**
318
+
274
319
  - Private key is encrypted in memory using AES-256-GCM
275
320
  - Protected from memory dumps and debugging tools
276
321
  - Automatic secure cleanup when no longer needed
277
322
  - Minimal performance overhead
278
323
 
279
324
  **Example Test:**
325
+
280
326
  ```bash
281
327
  # Without encryption: private key visible in memory dump
282
328
  # With encryption: only encrypted bytes visible
@@ -298,17 +344,20 @@ Prevent duplicate message processing using a TTL-based cache:
298
344
  ```
299
345
 
300
346
  **How It Works:**
347
+
301
348
  - Maintains an in-memory cache of processed message IDs
302
349
  - Automatically expires entries after TTL (Time To Live)
303
350
  - Bounded size prevents unbounded memory growth
304
351
  - Messages without IDs are allowed through (graceful degradation)
305
352
 
306
353
  **Configuration Options:**
354
+
307
355
  - `enabled`: Enable/disable deduplication (default: true)
308
356
  - `ttl`: How long to remember message IDs in milliseconds (default: 60000ms = 1 minute)
309
357
  - `maxSize`: Maximum number of message IDs to cache (default: 10000)
310
358
 
311
359
  **Monitoring:**
360
+
312
361
  ```bash
313
362
  # Check deduplication status
314
363
  curl http://localhost:3000/api/deduplication
@@ -324,15 +373,18 @@ curl http://localhost:3000/api/deduplication
324
373
  ```
325
374
 
326
375
  **Events:**
376
+
327
377
  - `message:duplicate` - Emitted when a duplicate message is detected and skipped
328
378
 
329
379
  **Testing:**
380
+
330
381
  1. Send the same message multiple times rapidly
331
382
  2. Watch Events tab for `message:duplicate` events
332
383
  3. Verify duplicates are not processed
333
384
  4. Monitor `/api/deduplication` to see cache size increase
334
385
 
335
386
  **Production Benefits:**
387
+
336
388
  - Prevents duplicate task execution if messages are retransmitted
337
389
  - Protects against network-level duplicates during reconnections
338
390
  - Configurable TTL balances memory usage vs duplicate window
@@ -354,11 +406,13 @@ curl http://localhost:3000/api/agents/search/status/online
354
406
  ```
355
407
 
356
408
  **Performance Comparison:**
409
+
357
410
  - Traditional: O(n) - iterate through all agents
358
411
  - Indexed: O(1) - direct map lookup for capability/status
359
412
  - Indexed: O(k) - token-based search for names (k = tokens)
360
413
 
361
414
  **SDK Usage:**
415
+
362
416
  ```typescript
363
417
  // Fast capability search
364
418
  const weatherAgents = sdk.findAgentsByCapability("weather-forecast");
@@ -524,7 +578,7 @@ Monitor rate limit status via `/metrics` endpoint.
524
578
  - Watch Webhooks tab for incoming webhook events
525
579
  - See event types: `task`, `agent_selected`, `task_response`
526
580
 
527
- ### 5. Test Room Management
581
+ ### 5. Test Room Management (v1)
528
582
 
529
583
  - Go to Rooms tab
530
584
  - Enter a room ID
@@ -532,6 +586,29 @@ Monitor rate limit status via `/metrics` endpoint.
532
586
  - See room appear in subscribed list
533
587
  - Click "Unsubscribe" to unsubscribe from room
534
588
 
589
+ ### 5b. Test Room Management v2.0
590
+
591
+ - Go to **Room Mgmt** tab
592
+ - See your owned and shared rooms
593
+ - Check your room limit (e.g., "2/50 rooms")
594
+ - **Create a room**: Enter name and description, click "Create Room"
595
+ - See room appear in "Private Rooms" list with owner badge
596
+ - **Update room**: Click "Update" on an owned room, modify name/description
597
+ - **Delete room**: Click "Delete" on an owned room
598
+ - Watch Events tab for `room:created`, `room:updated`, `room:deleted` events
599
+
600
+ ### 5c. Test Agent-Room Management v2.0
601
+
602
+ - Go to **Agent-Room** tab
603
+ - Select a room you own from the dropdown
604
+ - See "Agents in Room" list (may be empty for new rooms)
605
+ - See "Available Agents" list (agents you can add)
606
+ - **Add an agent**: Click "Add" next to an available agent
607
+ - Watch agent move from "Available" to "Agents in Room"
608
+ - See agent count update in real-time
609
+ - **Remove an agent**: Click "Remove" next to an agent in room
610
+ - Watch Events tab for `agent_room:agent_added`, `agent_room:agent_removed` events
611
+
535
612
  ### 6. Test Signature Verification
536
613
 
537
614
  - Enable in `.env`: `ENABLE_SIGNATURE_VERIFICATION=true`
@@ -637,7 +714,7 @@ Monitor rate limit status via `/metrics` endpoint.
637
714
 
638
715
  - **Problem**: "Authentication Pending" never completes
639
716
  - **Solution**: Verify `PRIVATE_KEY` and `WALLET_ADDRESS` are correct
640
- - **Check**: Ensure wallet has access to the Teneo network
717
+ - **Check**: Ensure wallet has access to the Teneo Protocol
641
718
 
642
719
  ### Webhook Not Receiving
643
720