@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
@@ -0,0 +1,527 @@
1
+ /**
2
+ * Unit tests for AgentRoomManager
3
+ * Tests agent-room operations, caching, validation, and error handling
4
+ */
5
+
6
+ import { describe, it, expect, beforeEach, vi } from "vitest";
7
+ import { AgentRoomManager, AgentRoomInfo } from "../../../src/managers/agent-room-manager";
8
+ import { RoomManagementManager } from "../../../src/managers/room-management-manager";
9
+ import { WebSocketClient } from "../../../src/core/websocket-client";
10
+ import { Logger, RoomInfo } from "../../../src/types";
11
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
12
+ import { ErrorCode } from "../../../src/types/error-codes";
13
+
14
+ describe("AgentRoomManager", () => {
15
+ let manager: AgentRoomManager;
16
+ let mockWsClient: WebSocketClient;
17
+ let mockLogger: Logger;
18
+ let mockRoomManagement: RoomManagementManager;
19
+
20
+ beforeEach(() => {
21
+ // Create mock logger
22
+ mockLogger = {
23
+ debug: vi.fn(),
24
+ info: vi.fn(),
25
+ warn: vi.fn(),
26
+ error: vi.fn()
27
+ };
28
+
29
+ // Create mock WebSocket client
30
+ mockWsClient = {
31
+ isConnected: true,
32
+ sendMessage: vi.fn().mockResolvedValue(undefined)
33
+ } as any;
34
+
35
+ // Create mock room management manager
36
+ mockRoomManagement = {
37
+ getRoomById: vi.fn().mockReturnValue({ id: "room-123", is_owner: true } as RoomInfo),
38
+ getOwnedRooms: vi.fn().mockReturnValue([{ id: "room-123", is_owner: true } as RoomInfo])
39
+ } as any;
40
+
41
+ // Create manager instance
42
+ manager = new AgentRoomManager(mockWsClient, mockLogger, mockRoomManagement);
43
+ });
44
+
45
+ describe("addAgentToRoom", () => {
46
+ it("should add agent to room successfully", async () => {
47
+ const addPromise = manager.addAgentToRoom("room-123", "agent-456");
48
+
49
+ setTimeout(() => {
50
+ manager.emit("agent_room:agent_added", "room-123", "agent-456");
51
+ }, 10);
52
+
53
+ await expect(addPromise).resolves.toBeUndefined();
54
+ expect(mockWsClient.sendMessage).toHaveBeenCalledWith({
55
+ type: "add_agent_to_room",
56
+ data: {
57
+ room_id: "room-123",
58
+ agent_id: "agent-456"
59
+ }
60
+ });
61
+ });
62
+
63
+ it("should reject if not connected", async () => {
64
+ mockWsClient.isConnected = false;
65
+
66
+ await expect(manager.addAgentToRoom("room-123", "agent-456")).rejects.toThrow(
67
+ "Not connected to Teneo Protocol"
68
+ );
69
+ });
70
+
71
+ it("should validate room ID", async () => {
72
+ await expect(manager.addAgentToRoom("", "agent-456")).rejects.toThrow(
73
+ "Room ID cannot be empty"
74
+ );
75
+ });
76
+
77
+ it("should validate agent ID", async () => {
78
+ await expect(manager.addAgentToRoom("room-123", "")).rejects.toThrow(
79
+ "Agent ID cannot be empty"
80
+ );
81
+ });
82
+
83
+ it("should check room ownership", async () => {
84
+ mockRoomManagement.getRoomById = vi
85
+ .fn()
86
+ .mockReturnValue({ id: "room-123", is_owner: false } as RoomInfo);
87
+ mockRoomManagement.getOwnedRooms = vi.fn().mockReturnValue([]);
88
+
89
+ await expect(manager.addAgentToRoom("room-123", "agent-456")).rejects.toThrow(
90
+ "You don't own this room"
91
+ );
92
+ });
93
+
94
+ it("should reject if room not found", async () => {
95
+ mockRoomManagement.getRoomById = vi.fn().mockReturnValue(undefined);
96
+
97
+ await expect(manager.addAgentToRoom("room-999", "agent-456")).rejects.toThrow(
98
+ "Room not found"
99
+ );
100
+ });
101
+
102
+ it("should timeout if no response", async () => {
103
+ vi.useFakeTimers();
104
+
105
+ const addPromise = manager.addAgentToRoom("room-123", "agent-456");
106
+
107
+ vi.advanceTimersByTime(30001);
108
+
109
+ await expect(addPromise).rejects.toThrow("timeout");
110
+
111
+ vi.useRealTimers();
112
+ });
113
+
114
+ it("should handle add errors", async () => {
115
+ const addPromise = manager.addAgentToRoom("room-123", "agent-456");
116
+
117
+ setTimeout(() => {
118
+ manager.emit("agent_room:add_error", new Error("Agent already in room"), "room-123");
119
+ }, 10);
120
+
121
+ await expect(addPromise).rejects.toThrow("Agent already in room");
122
+ });
123
+
124
+ it("should invalidate cache after adding agent", async () => {
125
+ // Pre-populate cache
126
+ const cachedAgents: AgentRoomInfo[] = [{ agent_id: "agent-1", agent_name: "Agent 1" }];
127
+ manager.cacheRoomAgents("room-123", cachedAgents);
128
+
129
+ expect(manager.getRoomAgents("room-123")).toHaveLength(1);
130
+
131
+ const addPromise = manager.addAgentToRoom("room-123", "agent-456");
132
+
133
+ setTimeout(() => {
134
+ manager.emit("agent_room:agent_added", "room-123", "agent-456");
135
+ }, 10);
136
+
137
+ await addPromise;
138
+
139
+ // Cache should be invalidated
140
+ expect(manager.getRoomAgents("room-123")).toBeUndefined();
141
+ });
142
+ });
143
+
144
+ describe("removeAgentFromRoom", () => {
145
+ it("should remove agent from room successfully", async () => {
146
+ const removePromise = manager.removeAgentFromRoom("room-123", "agent-456");
147
+
148
+ setTimeout(() => {
149
+ manager.emit("agent_room:agent_removed", "room-123", "agent-456");
150
+ }, 10);
151
+
152
+ await expect(removePromise).resolves.toBeUndefined();
153
+ expect(mockWsClient.sendMessage).toHaveBeenCalledWith({
154
+ type: "remove_agent_from_room",
155
+ data: {
156
+ room_id: "room-123",
157
+ agent_id: "agent-456"
158
+ }
159
+ });
160
+ });
161
+
162
+ it("should reject if not connected", async () => {
163
+ mockWsClient.isConnected = false;
164
+
165
+ await expect(manager.removeAgentFromRoom("room-123", "agent-456")).rejects.toThrow(
166
+ "Not connected to Teneo Protocol"
167
+ );
168
+ });
169
+
170
+ it("should validate room ID", async () => {
171
+ await expect(manager.removeAgentFromRoom("", "agent-456")).rejects.toThrow(
172
+ "Room ID cannot be empty"
173
+ );
174
+ });
175
+
176
+ it("should validate agent ID", async () => {
177
+ await expect(manager.removeAgentFromRoom("room-123", "")).rejects.toThrow(
178
+ "Agent ID cannot be empty"
179
+ );
180
+ });
181
+
182
+ it("should check room ownership", async () => {
183
+ mockRoomManagement.getRoomById = vi
184
+ .fn()
185
+ .mockReturnValue({ id: "room-123", is_owner: false } as RoomInfo);
186
+ mockRoomManagement.getOwnedRooms = vi.fn().mockReturnValue([]);
187
+
188
+ await expect(manager.removeAgentFromRoom("room-123", "agent-456")).rejects.toThrow(
189
+ "You don't own this room"
190
+ );
191
+ });
192
+
193
+ it("should handle remove errors", async () => {
194
+ const removePromise = manager.removeAgentFromRoom("room-123", "agent-456");
195
+
196
+ setTimeout(() => {
197
+ manager.emit("agent_room:remove_error", new Error("Agent not in room"), "room-123");
198
+ }, 10);
199
+
200
+ await expect(removePromise).rejects.toThrow("Agent not in room");
201
+ });
202
+
203
+ it("should invalidate cache after removing agent", async () => {
204
+ // Pre-populate cache
205
+ const cachedAgents: AgentRoomInfo[] = [{ agent_id: "agent-456", agent_name: "Agent 456" }];
206
+ manager.cacheRoomAgents("room-123", cachedAgents);
207
+
208
+ expect(manager.getRoomAgents("room-123")).toHaveLength(1);
209
+
210
+ const removePromise = manager.removeAgentFromRoom("room-123", "agent-456");
211
+
212
+ setTimeout(() => {
213
+ manager.emit("agent_room:agent_removed", "room-123", "agent-456");
214
+ }, 10);
215
+
216
+ await removePromise;
217
+
218
+ // Cache should be invalidated
219
+ expect(manager.getRoomAgents("room-123")).toBeUndefined();
220
+ });
221
+ });
222
+
223
+ describe("listRoomAgents", () => {
224
+ const mockAgents: AgentRoomInfo[] = [
225
+ { agent_id: "agent-1", agent_name: "Agent 1", status: "online" },
226
+ { agent_id: "agent-2", agent_name: "Agent 2", status: "offline" }
227
+ ];
228
+
229
+ it("should list room agents successfully", async () => {
230
+ const listPromise = manager.listRoomAgents("room-123", false);
231
+
232
+ setTimeout(() => {
233
+ manager.emit("agent_room:agents_listed", "room-123", mockAgents);
234
+ }, 10);
235
+
236
+ const result = await listPromise;
237
+
238
+ expect(result).toHaveLength(2);
239
+ expect(result[0].agent_id).toBe("agent-1");
240
+ expect(mockWsClient.sendMessage).toHaveBeenCalledWith({
241
+ type: "list_room_agents",
242
+ data: {
243
+ room_id: "room-123"
244
+ }
245
+ });
246
+ });
247
+
248
+ it("should use cached data if available", async () => {
249
+ // Pre-populate cache
250
+ manager.cacheRoomAgents("room-123", mockAgents);
251
+
252
+ const result = await manager.listRoomAgents("room-123", true);
253
+
254
+ expect(result).toHaveLength(2);
255
+ expect(mockWsClient.sendMessage).not.toHaveBeenCalled();
256
+ });
257
+
258
+ it("should bypass cache when useCache is false", async () => {
259
+ // Pre-populate cache
260
+ manager.cacheRoomAgents("room-123", mockAgents);
261
+
262
+ const listPromise = manager.listRoomAgents("room-123", false);
263
+
264
+ setTimeout(() => {
265
+ manager.emit("agent_room:agents_listed", "room-123", mockAgents);
266
+ }, 10);
267
+
268
+ await listPromise;
269
+
270
+ expect(mockWsClient.sendMessage).toHaveBeenCalled();
271
+ });
272
+
273
+ it("should reject if not connected", async () => {
274
+ mockWsClient.isConnected = false;
275
+
276
+ await expect(manager.listRoomAgents("room-123")).rejects.toThrow(
277
+ "Not connected to Teneo Protocol"
278
+ );
279
+ });
280
+
281
+ it("should validate room ID", async () => {
282
+ await expect(manager.listRoomAgents("")).rejects.toThrow("Room ID cannot be empty");
283
+ });
284
+
285
+ it("should fetch from server if cache is expired", async () => {
286
+ vi.useFakeTimers();
287
+
288
+ // Cache data
289
+ manager.cacheRoomAgents("room-123", mockAgents);
290
+
291
+ // Advance time beyond cache TTL (5 minutes)
292
+ vi.advanceTimersByTime(5 * 60 * 1000 + 1);
293
+
294
+ const listPromise = manager.listRoomAgents("room-123", true);
295
+
296
+ // Advance timers to trigger the setTimeout
297
+ vi.advanceTimersByTime(10);
298
+
299
+ // Emit the event
300
+ manager.emit("agent_room:agents_listed", "room-123", mockAgents);
301
+
302
+ await listPromise;
303
+
304
+ expect(mockWsClient.sendMessage).toHaveBeenCalled();
305
+
306
+ vi.useRealTimers();
307
+ });
308
+
309
+ it("should handle list errors", async () => {
310
+ const listPromise = manager.listRoomAgents("room-123");
311
+
312
+ setTimeout(() => {
313
+ manager.emit("agent_room:list_error", new Error("Room not found"), "room-123");
314
+ }, 10);
315
+
316
+ await expect(listPromise).rejects.toThrow("Room not found");
317
+ });
318
+ });
319
+
320
+ describe("listAvailableAgents", () => {
321
+ const mockAgents: AgentRoomInfo[] = [
322
+ { agent_id: "agent-3", agent_name: "Agent 3", status: "online" },
323
+ { agent_id: "agent-4", agent_name: "Agent 4", status: "online" }
324
+ ];
325
+
326
+ it("should list available agents successfully", async () => {
327
+ const listPromise = manager.listAvailableAgents("room-123", false);
328
+
329
+ setTimeout(() => {
330
+ manager.emit("agent_room:available_agents_listed", mockAgents);
331
+ }, 10);
332
+
333
+ const result = await listPromise;
334
+
335
+ expect(result).toHaveLength(2);
336
+ expect(result[0].agent_id).toBe("agent-3");
337
+ expect(mockWsClient.sendMessage).toHaveBeenCalledWith({
338
+ type: "list_available_agents",
339
+ data: {
340
+ room_id: "room-123"
341
+ }
342
+ });
343
+ });
344
+
345
+ it("should use cached data if available", async () => {
346
+ // Pre-populate cache
347
+ manager.cacheAvailableAgents("room-123", mockAgents);
348
+
349
+ const result = await manager.listAvailableAgents("room-123", true);
350
+
351
+ expect(result).toHaveLength(2);
352
+ expect(mockWsClient.sendMessage).not.toHaveBeenCalled();
353
+ });
354
+
355
+ it("should reject if not connected", async () => {
356
+ mockWsClient.isConnected = false;
357
+
358
+ await expect(manager.listAvailableAgents("room-123")).rejects.toThrow(
359
+ "Not connected to Teneo Protocol"
360
+ );
361
+ });
362
+
363
+ it("should validate room ID", async () => {
364
+ await expect(manager.listAvailableAgents("")).rejects.toThrow("Room ID cannot be empty");
365
+ });
366
+ });
367
+
368
+ describe("Query Methods", () => {
369
+ const mockAgents: AgentRoomInfo[] = [
370
+ { agent_id: "agent-1", agent_name: "Agent 1" },
371
+ { agent_id: "agent-2", agent_name: "Agent 2" }
372
+ ];
373
+
374
+ it("should get room agents from cache", () => {
375
+ manager.cacheRoomAgents("room-123", mockAgents);
376
+
377
+ const result = manager.getRoomAgents("room-123");
378
+
379
+ expect(result).toHaveLength(2);
380
+ expect(result![0].agent_id).toBe("agent-1");
381
+ });
382
+
383
+ it("should return undefined if room agents not cached", () => {
384
+ const result = manager.getRoomAgents("room-999");
385
+ expect(result).toBeUndefined();
386
+ });
387
+
388
+ it("should get available agents from cache", () => {
389
+ manager.cacheAvailableAgents("room-123", mockAgents);
390
+
391
+ const result = manager.getAvailableAgents("room-123");
392
+
393
+ expect(result).toHaveLength(2);
394
+ expect(result![0].agent_id).toBe("agent-1");
395
+ });
396
+
397
+ it("should return undefined if available agents not cached", () => {
398
+ const result = manager.getAvailableAgents("room-999");
399
+ expect(result).toBeUndefined();
400
+ });
401
+
402
+ it("should check if agent is in room", () => {
403
+ manager.cacheRoomAgents("room-123", mockAgents);
404
+
405
+ expect(manager.isAgentInRoom("room-123", "agent-1")).toBe(true);
406
+ expect(manager.isAgentInRoom("room-123", "agent-999")).toBe(false);
407
+ });
408
+
409
+ it("should return undefined for isAgentInRoom if not cached", () => {
410
+ expect(manager.isAgentInRoom("room-999", "agent-1")).toBeUndefined();
411
+ });
412
+
413
+ it("should get room agent count", () => {
414
+ manager.cacheRoomAgents("room-123", mockAgents);
415
+
416
+ expect(manager.getRoomAgentCount("room-123")).toBe(2);
417
+ });
418
+
419
+ it("should return undefined for count if not cached", () => {
420
+ expect(manager.getRoomAgentCount("room-999")).toBeUndefined();
421
+ });
422
+ });
423
+
424
+ describe("Cache Management", () => {
425
+ const mockAgents: AgentRoomInfo[] = [{ agent_id: "agent-1", agent_name: "Agent 1" }];
426
+
427
+ it("should cache room agents", () => {
428
+ manager.cacheRoomAgents("room-123", mockAgents);
429
+
430
+ const result = manager.getRoomAgents("room-123");
431
+ expect(result).toHaveLength(1);
432
+ expect(result![0].agent_id).toBe("agent-1");
433
+ });
434
+
435
+ it("should cache available agents", () => {
436
+ manager.cacheAvailableAgents("room-123", mockAgents);
437
+
438
+ const result = manager.getAvailableAgents("room-123");
439
+ expect(result).toHaveLength(1);
440
+ });
441
+
442
+ it("should invalidate cache for specific room", () => {
443
+ manager.cacheRoomAgents("room-123", mockAgents);
444
+ manager.cacheAvailableAgents("room-123", mockAgents);
445
+ manager.cacheRoomAgents("room-456", mockAgents);
446
+
447
+ manager.invalidateCache("room-123");
448
+
449
+ expect(manager.getRoomAgents("room-123")).toBeUndefined();
450
+ expect(manager.getAvailableAgents("room-123")).toBeUndefined();
451
+ expect(manager.getRoomAgents("room-456")).toBeDefined();
452
+ });
453
+
454
+ it("should clear all caches", () => {
455
+ manager.cacheRoomAgents("room-123", mockAgents);
456
+ manager.cacheRoomAgents("room-456", mockAgents);
457
+ manager.cacheAvailableAgents("room-123", mockAgents);
458
+
459
+ manager.clearAllCaches();
460
+
461
+ expect(manager.getRoomAgents("room-123")).toBeUndefined();
462
+ expect(manager.getRoomAgents("room-456")).toBeUndefined();
463
+ expect(manager.getAvailableAgents("room-123")).toBeUndefined();
464
+ });
465
+ });
466
+
467
+ describe("Status Updates", () => {
468
+ const mockAgents: AgentRoomInfo[] = [
469
+ { agent_id: "agent-1", agent_name: "Agent 1", status: "online" }
470
+ ];
471
+
472
+ it("should handle status updates and invalidate cache", () => {
473
+ manager.cacheRoomAgents("room-123", mockAgents);
474
+
475
+ expect(manager.getRoomAgents("room-123")).toBeDefined();
476
+
477
+ manager.handleStatusUpdate("room-123", "agent-1", "offline");
478
+
479
+ // Cache should be invalidated
480
+ expect(manager.getRoomAgents("room-123")).toBeUndefined();
481
+ });
482
+
483
+ it("should not invalidate other room caches on status update", () => {
484
+ manager.cacheRoomAgents("room-123", mockAgents);
485
+ manager.cacheRoomAgents("room-456", mockAgents);
486
+
487
+ manager.handleStatusUpdate("room-123", "agent-1", "offline");
488
+
489
+ expect(manager.getRoomAgents("room-123")).toBeUndefined();
490
+ expect(manager.getRoomAgents("room-456")).toBeDefined();
491
+ });
492
+ });
493
+
494
+ describe("Return Value Immutability", () => {
495
+ const mockAgents: AgentRoomInfo[] = [{ agent_id: "agent-1", agent_name: "Agent 1" }];
496
+
497
+ it("should return defensive copies from getRoomAgents", () => {
498
+ manager.cacheRoomAgents("room-123", mockAgents);
499
+
500
+ const agents1 = manager.getRoomAgents("room-123");
501
+ const agents2 = manager.getRoomAgents("room-123");
502
+
503
+ expect(agents1).not.toBe(agents2);
504
+ expect(agents1![0]).not.toBe(agents2![0]);
505
+ });
506
+
507
+ it("should return defensive copies from getAvailableAgents", () => {
508
+ manager.cacheAvailableAgents("room-123", mockAgents);
509
+
510
+ const agents1 = manager.getAvailableAgents("room-123");
511
+ const agents2 = manager.getAvailableAgents("room-123");
512
+
513
+ expect(agents1).not.toBe(agents2);
514
+ expect(agents1![0]).not.toBe(agents2![0]);
515
+ });
516
+
517
+ it("should return defensive copies from listRoomAgents", async () => {
518
+ manager.cacheRoomAgents("room-123", mockAgents);
519
+
520
+ const result1 = await manager.listRoomAgents("room-123", true);
521
+ const result2 = await manager.listRoomAgents("room-123", true);
522
+
523
+ expect(result1).not.toBe(result2);
524
+ expect(result1[0]).not.toBe(result2[0]);
525
+ });
526
+ });
527
+ });