@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,697 @@
1
+ /**
2
+ * Unit tests for AuthSuccessHandler - Room Management Initialization
3
+ * Tests room categorization and room management manager initialization
4
+ */
5
+
6
+ import { describe, it, expect, beforeEach, vi } from "vitest";
7
+ import { AuthSuccessHandler } from "../../../src/handlers/message-handlers/auth-success-handler";
8
+ import { HandlerContext } from "../../../src/handlers/message-handlers/types";
9
+ import { AuthSuccessMessage, RoomInfo, Logger } from "../../../src/types";
10
+
11
+ describe("AuthSuccessHandler - Room Management", () => {
12
+ let handler: AuthSuccessHandler;
13
+ let mockContext: HandlerContext;
14
+ let mockLogger: Logger;
15
+ let mockRoomManagementManager: any;
16
+ let emitSpy: ReturnType<typeof vi.fn>;
17
+ let updateAuthStateSpy: ReturnType<typeof vi.fn>;
18
+ let updateConnectionStateSpy: ReturnType<typeof vi.fn>;
19
+ let getAuthStateSpy: ReturnType<typeof vi.fn>;
20
+
21
+ beforeEach(() => {
22
+ // Create mock logger
23
+ mockLogger = {
24
+ debug: vi.fn(),
25
+ info: vi.fn(),
26
+ warn: vi.fn(),
27
+ error: vi.fn()
28
+ };
29
+
30
+ // Create mock room management manager
31
+ mockRoomManagementManager = {
32
+ setRoomLimit: vi.fn(),
33
+ setOwnedRooms: vi.fn(),
34
+ setSharedRooms: vi.fn()
35
+ };
36
+
37
+ // Create spies
38
+ emitSpy = vi.fn();
39
+ updateAuthStateSpy = vi.fn();
40
+ updateConnectionStateSpy = vi.fn();
41
+ getAuthStateSpy = vi.fn().mockReturnValue({
42
+ authenticated: true,
43
+ clientId: "client-123",
44
+ walletAddress: "0xabc..."
45
+ });
46
+
47
+ // Create mock context
48
+ mockContext = {
49
+ emit: emitSpy,
50
+ sendWebhook: vi.fn().mockResolvedValue(undefined),
51
+ logger: mockLogger,
52
+ getConnectionState: vi.fn(),
53
+ getAuthState: getAuthStateSpy,
54
+ updateConnectionState: updateConnectionStateSpy,
55
+ updateAuthState: updateAuthStateSpy,
56
+ sendMessage: vi.fn(),
57
+ roomManagementManager: mockRoomManagementManager
58
+ };
59
+
60
+ // Create handler instance
61
+ handler = new AuthSuccessHandler();
62
+ });
63
+
64
+ describe("Room Extraction", () => {
65
+ it("should extract rooms from auth success message", async () => {
66
+ const rooms: RoomInfo[] = [
67
+ {
68
+ id: "room-1",
69
+ name: "My Room",
70
+ is_owner: true
71
+ } as RoomInfo,
72
+ {
73
+ id: "room-2",
74
+ name: "Shared Room",
75
+ is_owner: false
76
+ } as RoomInfo
77
+ ];
78
+
79
+ const message: AuthSuccessMessage = {
80
+ type: "auth_success",
81
+ data: {
82
+ id: "client-123",
83
+ type: "user",
84
+ address: "0xabc...",
85
+ rooms
86
+ }
87
+ } as AuthSuccessMessage;
88
+
89
+ await handler.handle(message, mockContext);
90
+
91
+ // Should update auth state with room data
92
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
93
+ expect.objectContaining({
94
+ roomObjects: rooms
95
+ })
96
+ );
97
+ });
98
+
99
+ it("should handle missing rooms array", async () => {
100
+ const message: AuthSuccessMessage = {
101
+ type: "auth_success",
102
+ data: {
103
+ id: "client-123",
104
+ type: "user",
105
+ address: "0xabc..."
106
+ // rooms field is undefined
107
+ }
108
+ } as AuthSuccessMessage;
109
+
110
+ await handler.handle(message, mockContext);
111
+
112
+ // Should still work with empty array
113
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
114
+ expect.objectContaining({
115
+ roomObjects: [],
116
+ privateRoomIds: [],
117
+ sharedRoomIds: []
118
+ })
119
+ );
120
+ });
121
+
122
+ it("should handle null rooms", async () => {
123
+ const message: AuthSuccessMessage = {
124
+ type: "auth_success",
125
+ data: {
126
+ id: "client-123",
127
+ type: "user",
128
+ address: "0xabc...",
129
+ rooms: null as any
130
+ }
131
+ } as AuthSuccessMessage;
132
+
133
+ await handler.handle(message, mockContext);
134
+
135
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
136
+ expect.objectContaining({
137
+ roomObjects: []
138
+ })
139
+ );
140
+ });
141
+
142
+ it("should handle empty rooms array", async () => {
143
+ const message: AuthSuccessMessage = {
144
+ type: "auth_success",
145
+ data: {
146
+ id: "client-123",
147
+ type: "user",
148
+ address: "0xabc...",
149
+ rooms: []
150
+ }
151
+ } as AuthSuccessMessage;
152
+
153
+ await handler.handle(message, mockContext);
154
+
155
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
156
+ expect.objectContaining({
157
+ roomObjects: [],
158
+ privateRoomIds: [],
159
+ sharedRoomIds: []
160
+ })
161
+ );
162
+ });
163
+ });
164
+
165
+ describe("Room Categorization", () => {
166
+ it("should categorize owned rooms (is_owner: true)", async () => {
167
+ const rooms: RoomInfo[] = [
168
+ {
169
+ id: "room-1",
170
+ name: "My Room 1",
171
+ is_owner: true
172
+ } as RoomInfo,
173
+ {
174
+ id: "room-2",
175
+ name: "My Room 2",
176
+ is_owner: true
177
+ } as RoomInfo
178
+ ];
179
+
180
+ const message: AuthSuccessMessage = {
181
+ type: "auth_success",
182
+ data: {
183
+ id: "client-123",
184
+ type: "user",
185
+ address: "0xabc...",
186
+ rooms
187
+ }
188
+ } as AuthSuccessMessage;
189
+
190
+ await handler.handle(message, mockContext);
191
+
192
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
193
+ expect.objectContaining({
194
+ privateRoomIds: ["room-1", "room-2"],
195
+ sharedRoomIds: []
196
+ })
197
+ );
198
+ });
199
+
200
+ it("should categorize shared rooms (is_owner: false)", async () => {
201
+ const rooms: RoomInfo[] = [
202
+ {
203
+ id: "room-3",
204
+ name: "Shared Room 1",
205
+ is_owner: false
206
+ } as RoomInfo,
207
+ {
208
+ id: "room-4",
209
+ name: "Shared Room 2",
210
+ is_owner: false
211
+ } as RoomInfo
212
+ ];
213
+
214
+ const message: AuthSuccessMessage = {
215
+ type: "auth_success",
216
+ data: {
217
+ id: "client-123",
218
+ type: "user",
219
+ address: "0xabc...",
220
+ rooms
221
+ }
222
+ } as AuthSuccessMessage;
223
+
224
+ await handler.handle(message, mockContext);
225
+
226
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
227
+ expect.objectContaining({
228
+ privateRoomIds: [],
229
+ sharedRoomIds: ["room-3", "room-4"]
230
+ })
231
+ );
232
+ });
233
+
234
+ it("should categorize mixed owned and shared rooms", async () => {
235
+ const rooms: RoomInfo[] = [
236
+ {
237
+ id: "room-1",
238
+ name: "My Room",
239
+ is_owner: true
240
+ } as RoomInfo,
241
+ {
242
+ id: "room-2",
243
+ name: "Shared Room",
244
+ is_owner: false
245
+ } as RoomInfo,
246
+ {
247
+ id: "room-3",
248
+ name: "Another Owned",
249
+ is_owner: true
250
+ } as RoomInfo,
251
+ {
252
+ id: "room-4",
253
+ name: "Another Shared",
254
+ is_owner: false
255
+ } as RoomInfo
256
+ ];
257
+
258
+ const message: AuthSuccessMessage = {
259
+ type: "auth_success",
260
+ data: {
261
+ id: "client-123",
262
+ type: "user",
263
+ address: "0xabc...",
264
+ rooms
265
+ }
266
+ } as AuthSuccessMessage;
267
+
268
+ await handler.handle(message, mockContext);
269
+
270
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
271
+ expect.objectContaining({
272
+ privateRoomIds: ["room-1", "room-3"],
273
+ sharedRoomIds: ["room-2", "room-4"]
274
+ })
275
+ );
276
+ });
277
+
278
+ it("should handle rooms with missing is_owner flag", async () => {
279
+ const rooms: RoomInfo[] = [
280
+ {
281
+ id: "room-1",
282
+ name: "Room without flag"
283
+ // is_owner is undefined
284
+ } as RoomInfo
285
+ ];
286
+
287
+ const message: AuthSuccessMessage = {
288
+ type: "auth_success",
289
+ data: {
290
+ id: "client-123",
291
+ type: "user",
292
+ address: "0xabc...",
293
+ rooms
294
+ }
295
+ } as AuthSuccessMessage;
296
+
297
+ await handler.handle(message, mockContext);
298
+
299
+ // Undefined is_owner should be treated as falsy (shared room)
300
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
301
+ expect.objectContaining({
302
+ privateRoomIds: [],
303
+ sharedRoomIds: ["room-1"]
304
+ })
305
+ );
306
+ });
307
+ });
308
+
309
+ describe("Room Management Manager Initialization", () => {
310
+ it("should initialize room management manager with room limit", async () => {
311
+ const message: AuthSuccessMessage = {
312
+ type: "auth_success",
313
+ data: {
314
+ id: "client-123",
315
+ type: "user",
316
+ address: "0xabc...",
317
+ rooms: [],
318
+ max_private_rooms: 5
319
+ }
320
+ } as AuthSuccessMessage;
321
+
322
+ await handler.handle(message, mockContext);
323
+
324
+ expect(mockRoomManagementManager.setRoomLimit).toHaveBeenCalledWith(5);
325
+ });
326
+
327
+ it("should initialize with owned rooms", async () => {
328
+ const ownedRooms: RoomInfo[] = [
329
+ {
330
+ id: "room-1",
331
+ name: "My Room 1",
332
+ is_owner: true
333
+ } as RoomInfo,
334
+ {
335
+ id: "room-2",
336
+ name: "My Room 2",
337
+ is_owner: true
338
+ } as RoomInfo
339
+ ];
340
+
341
+ const message: AuthSuccessMessage = {
342
+ type: "auth_success",
343
+ data: {
344
+ id: "client-123",
345
+ type: "user",
346
+ address: "0xabc...",
347
+ rooms: ownedRooms
348
+ }
349
+ } as AuthSuccessMessage;
350
+
351
+ await handler.handle(message, mockContext);
352
+
353
+ expect(mockRoomManagementManager.setOwnedRooms).toHaveBeenCalledWith(ownedRooms);
354
+ });
355
+
356
+ it("should initialize with shared rooms", async () => {
357
+ const sharedRooms: RoomInfo[] = [
358
+ {
359
+ id: "room-3",
360
+ name: "Shared Room 1",
361
+ is_owner: false
362
+ } as RoomInfo,
363
+ {
364
+ id: "room-4",
365
+ name: "Shared Room 2",
366
+ is_owner: false
367
+ } as RoomInfo
368
+ ];
369
+
370
+ const message: AuthSuccessMessage = {
371
+ type: "auth_success",
372
+ data: {
373
+ id: "client-123",
374
+ type: "user",
375
+ address: "0xabc...",
376
+ rooms: sharedRooms
377
+ }
378
+ } as AuthSuccessMessage;
379
+
380
+ await handler.handle(message, mockContext);
381
+
382
+ expect(mockRoomManagementManager.setSharedRooms).toHaveBeenCalledWith(sharedRooms);
383
+ });
384
+
385
+ it("should initialize with mixed rooms", async () => {
386
+ const rooms: RoomInfo[] = [
387
+ {
388
+ id: "room-1",
389
+ name: "My Room",
390
+ is_owner: true
391
+ } as RoomInfo,
392
+ {
393
+ id: "room-2",
394
+ name: "Shared Room",
395
+ is_owner: false
396
+ } as RoomInfo,
397
+ {
398
+ id: "room-3",
399
+ name: "Another Owned",
400
+ is_owner: true
401
+ } as RoomInfo
402
+ ];
403
+
404
+ const message: AuthSuccessMessage = {
405
+ type: "auth_success",
406
+ data: {
407
+ id: "client-123",
408
+ type: "user",
409
+ address: "0xabc...",
410
+ rooms,
411
+ max_private_rooms: 3
412
+ }
413
+ } as AuthSuccessMessage;
414
+
415
+ await handler.handle(message, mockContext);
416
+
417
+ const ownedRooms = rooms.filter((r) => r.is_owner);
418
+ const sharedRooms = rooms.filter((r) => !r.is_owner);
419
+
420
+ expect(mockRoomManagementManager.setRoomLimit).toHaveBeenCalledWith(3);
421
+ expect(mockRoomManagementManager.setOwnedRooms).toHaveBeenCalledWith(ownedRooms);
422
+ expect(mockRoomManagementManager.setSharedRooms).toHaveBeenCalledWith(sharedRooms);
423
+ });
424
+
425
+ it("should log debug info after initialization", async () => {
426
+ const rooms: RoomInfo[] = [
427
+ { id: "room-1", name: "Owned", is_owner: true } as RoomInfo,
428
+ { id: "room-2", name: "Shared", is_owner: false } as RoomInfo
429
+ ];
430
+
431
+ const message: AuthSuccessMessage = {
432
+ type: "auth_success",
433
+ data: {
434
+ id: "client-123",
435
+ type: "user",
436
+ address: "0xabc...",
437
+ rooms,
438
+ max_private_rooms: 5
439
+ }
440
+ } as AuthSuccessMessage;
441
+
442
+ await handler.handle(message, mockContext);
443
+
444
+ expect(mockLogger.debug).toHaveBeenCalledWith(
445
+ "Room management initialized",
446
+ expect.objectContaining({
447
+ owned: 1,
448
+ shared: 1,
449
+ limit: 5
450
+ })
451
+ );
452
+ });
453
+
454
+ it("should work without room limit", async () => {
455
+ const message: AuthSuccessMessage = {
456
+ type: "auth_success",
457
+ data: {
458
+ id: "client-123",
459
+ type: "user",
460
+ address: "0xabc...",
461
+ rooms: []
462
+ // max_private_rooms is undefined
463
+ }
464
+ } as AuthSuccessMessage;
465
+
466
+ await handler.handle(message, mockContext);
467
+
468
+ // Should not call setRoomLimit
469
+ expect(mockRoomManagementManager.setRoomLimit).not.toHaveBeenCalled();
470
+
471
+ // Should still initialize room lists
472
+ expect(mockRoomManagementManager.setOwnedRooms).toHaveBeenCalledWith([]);
473
+ expect(mockRoomManagementManager.setSharedRooms).toHaveBeenCalledWith([]);
474
+ });
475
+ });
476
+
477
+ describe("Backward Compatibility", () => {
478
+ it("should include deprecated fields in auth state", async () => {
479
+ const rooms: RoomInfo[] = [
480
+ { id: "room-1", name: "Room 1", is_owner: true } as RoomInfo,
481
+ { id: "room-2", name: "Room 2", is_owner: false } as RoomInfo
482
+ ];
483
+
484
+ const message: AuthSuccessMessage = {
485
+ type: "auth_success",
486
+ data: {
487
+ id: "client-123",
488
+ type: "user",
489
+ address: "0xabc...",
490
+ rooms,
491
+ private_room_id: "room-1" // DEPRECATED field
492
+ }
493
+ } as AuthSuccessMessage;
494
+
495
+ await handler.handle(message, mockContext);
496
+
497
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
498
+ expect.objectContaining({
499
+ rooms: ["room-1", "room-2"], // DEPRECATED: flat list of IDs
500
+ privateRoomId: "room-1" // DEPRECATED: single ID
501
+ })
502
+ );
503
+ });
504
+
505
+ it("should include new v2.0 fields in auth state", async () => {
506
+ const rooms: RoomInfo[] = [
507
+ { id: "room-1", name: "Room 1", is_owner: true } as RoomInfo,
508
+ { id: "room-2", name: "Room 2", is_owner: false } as RoomInfo
509
+ ];
510
+
511
+ const message: AuthSuccessMessage = {
512
+ type: "auth_success",
513
+ data: {
514
+ id: "client-123",
515
+ type: "user",
516
+ address: "0xabc...",
517
+ rooms,
518
+ max_private_rooms: 3
519
+ }
520
+ } as AuthSuccessMessage;
521
+
522
+ await handler.handle(message, mockContext);
523
+
524
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
525
+ expect.objectContaining({
526
+ roomObjects: rooms, // v2.0: Full objects
527
+ privateRoomIds: ["room-1"], // v2.0: Owned room IDs
528
+ sharedRoomIds: ["room-2"], // v2.0: Shared room IDs
529
+ maxPrivateRooms: 3 // v2.0: Room limit
530
+ })
531
+ );
532
+ });
533
+ });
534
+
535
+ describe("Without Room Management Manager", () => {
536
+ it("should work without roomManagementManager in context", async () => {
537
+ const contextWithoutManager = { ...mockContext, roomManagementManager: undefined };
538
+
539
+ const message: AuthSuccessMessage = {
540
+ type: "auth_success",
541
+ data: {
542
+ id: "client-123",
543
+ type: "user",
544
+ address: "0xabc...",
545
+ rooms: [{ id: "room-1", name: "Room", is_owner: true } as RoomInfo],
546
+ max_private_rooms: 3
547
+ }
548
+ } as AuthSuccessMessage;
549
+
550
+ // Should not throw
551
+ await handler.handle(message, contextWithoutManager);
552
+
553
+ // Should still update auth state
554
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
555
+ expect.objectContaining({
556
+ roomObjects: expect.any(Array),
557
+ maxPrivateRooms: 3
558
+ })
559
+ );
560
+
561
+ // Should still emit events
562
+ expect(emitSpy).toHaveBeenCalledWith("auth:success", expect.anything());
563
+ expect(emitSpy).toHaveBeenCalledWith("ready");
564
+ });
565
+
566
+ it("should handle null roomManagementManager", async () => {
567
+ const contextWithNullManager = { ...mockContext, roomManagementManager: null };
568
+
569
+ const message: AuthSuccessMessage = {
570
+ type: "auth_success",
571
+ data: {
572
+ id: "client-123",
573
+ type: "user",
574
+ address: "0xabc...",
575
+ rooms: []
576
+ }
577
+ } as AuthSuccessMessage;
578
+
579
+ // Should not throw
580
+ await handler.handle(message, contextWithNullManager);
581
+
582
+ expect(emitSpy).toHaveBeenCalledWith("ready");
583
+ });
584
+ });
585
+
586
+ describe("Event Emission", () => {
587
+ it("should emit auth:success event with auth state", async () => {
588
+ const message: AuthSuccessMessage = {
589
+ type: "auth_success",
590
+ data: {
591
+ id: "client-123",
592
+ type: "user",
593
+ address: "0xabc..."
594
+ }
595
+ } as AuthSuccessMessage;
596
+
597
+ const mockAuthState = {
598
+ authenticated: true,
599
+ clientId: "client-123",
600
+ walletAddress: "0xabc..."
601
+ };
602
+ getAuthStateSpy.mockReturnValue(mockAuthState);
603
+
604
+ await handler.handle(message, mockContext);
605
+
606
+ expect(emitSpy).toHaveBeenCalledWith("auth:success", mockAuthState);
607
+ });
608
+
609
+ it("should emit ready event after auth:success", async () => {
610
+ const message: AuthSuccessMessage = {
611
+ type: "auth_success",
612
+ data: {
613
+ id: "client-123",
614
+ type: "user",
615
+ address: "0xabc..."
616
+ }
617
+ } as AuthSuccessMessage;
618
+
619
+ await handler.handle(message, mockContext);
620
+
621
+ // Check that ready was emitted
622
+ expect(emitSpy).toHaveBeenCalledWith("ready");
623
+
624
+ // Check order: auth:success before ready
625
+ const calls = emitSpy.mock.calls;
626
+ const authSuccessIndex = calls.findIndex((call) => call[0] === "auth:success");
627
+ const readyIndex = calls.findIndex((call) => call[0] === "ready");
628
+
629
+ expect(authSuccessIndex).toBeGreaterThanOrEqual(0);
630
+ expect(readyIndex).toBeGreaterThan(authSuccessIndex);
631
+ });
632
+
633
+ it("should log authentication success", async () => {
634
+ const message: AuthSuccessMessage = {
635
+ type: "auth_success",
636
+ data: {
637
+ id: "client-123",
638
+ type: "user",
639
+ address: "0xabc..."
640
+ }
641
+ } as AuthSuccessMessage;
642
+
643
+ await handler.handle(message, mockContext);
644
+
645
+ expect(mockLogger.info).toHaveBeenCalledWith("Authentication successful");
646
+ });
647
+ });
648
+
649
+ describe("State Updates", () => {
650
+ it("should update connection state to authenticated", async () => {
651
+ const message: AuthSuccessMessage = {
652
+ type: "auth_success",
653
+ data: {
654
+ id: "client-123",
655
+ type: "user",
656
+ address: "0xabc..."
657
+ }
658
+ } as AuthSuccessMessage;
659
+
660
+ await handler.handle(message, mockContext);
661
+
662
+ expect(updateConnectionStateSpy).toHaveBeenCalledWith(
663
+ expect.objectContaining({
664
+ authenticated: true
665
+ })
666
+ );
667
+ });
668
+
669
+ it("should update auth state with all user data", async () => {
670
+ const message: AuthSuccessMessage = {
671
+ type: "auth_success",
672
+ data: {
673
+ id: "client-123",
674
+ type: "user",
675
+ address: "0xabc...",
676
+ is_whitelisted: true,
677
+ is_admin_whitelisted: false,
678
+ nft_verified: true,
679
+ rooms: []
680
+ }
681
+ } as AuthSuccessMessage;
682
+
683
+ await handler.handle(message, mockContext);
684
+
685
+ expect(updateAuthStateSpy).toHaveBeenCalledWith(
686
+ expect.objectContaining({
687
+ authenticated: true,
688
+ clientId: "client-123",
689
+ walletAddress: "0xabc...",
690
+ isWhitelisted: true,
691
+ isAdmin: false,
692
+ nftVerified: true
693
+ })
694
+ );
695
+ });
696
+ });
697
+ });