@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,420 @@
1
+ /**
2
+ * Unit tests for RoomManagementManager
3
+ * Tests room CRUD operations, validation, caching, and error handling
4
+ */
5
+
6
+ import { describe, it, expect, beforeEach, vi } from "vitest";
7
+ import { RoomManagementManager } from "../../../src/managers/room-management-manager";
8
+ import { WebSocketClient } from "../../../src/core/websocket-client";
9
+ import { Logger, RoomInfo } from "../../../src/types";
10
+ import { ErrorCode } from "../../../src/types/error-codes";
11
+
12
+ describe("RoomManagementManager", () => {
13
+ let manager: RoomManagementManager;
14
+ let mockWsClient: WebSocketClient;
15
+ let mockLogger: Logger;
16
+
17
+ beforeEach(() => {
18
+ // Create mock logger
19
+ mockLogger = {
20
+ debug: vi.fn(),
21
+ info: vi.fn(),
22
+ warn: vi.fn(),
23
+ error: vi.fn()
24
+ };
25
+
26
+ // Create mock WebSocket client
27
+ mockWsClient = {
28
+ isConnected: true,
29
+ sendMessage: vi.fn().mockResolvedValue(undefined)
30
+ } as any;
31
+
32
+ // Create manager instance
33
+ manager = new RoomManagementManager(mockWsClient, mockLogger);
34
+ });
35
+
36
+ describe("createRoom", () => {
37
+ it("should create a room successfully", async () => {
38
+ const roomOptions = {
39
+ name: "Test Room",
40
+ description: "Test Description"
41
+ };
42
+
43
+ const createdRoom: RoomInfo = {
44
+ id: "room-123",
45
+ name: roomOptions.name,
46
+ description: roomOptions.description,
47
+ is_public: false,
48
+ created_by: "user-123",
49
+ created_at: new Date().toISOString(),
50
+ updated_at: new Date().toISOString(),
51
+ is_owner: true
52
+ };
53
+
54
+ // Start create operation
55
+ const createPromise = manager.createRoom(roomOptions);
56
+
57
+ // Simulate server response
58
+ setTimeout(() => {
59
+ manager.emit("room:created", createdRoom);
60
+ }, 10);
61
+
62
+ const result = await createPromise;
63
+
64
+ expect(result).toEqual(createdRoom);
65
+ expect(mockWsClient.sendMessage).toHaveBeenCalledWith({
66
+ type: "create_room",
67
+ data: {
68
+ name: roomOptions.name,
69
+ description: roomOptions.description
70
+ }
71
+ });
72
+ });
73
+
74
+ it("should reject if not connected", async () => {
75
+ mockWsClient.isConnected = false;
76
+
77
+ await expect(manager.createRoom({ name: "Test Room" })).rejects.toThrow(
78
+ "Not connected to Teneo Protocol"
79
+ );
80
+ });
81
+
82
+ it("should validate room name", async () => {
83
+ await expect(manager.createRoom({ name: "" })).rejects.toThrow("Room name cannot be empty");
84
+
85
+ await expect(manager.createRoom({ name: "a".repeat(101) })).rejects.toThrow(
86
+ "Room name too long"
87
+ );
88
+ });
89
+
90
+ it("should validate room description", async () => {
91
+ await expect(
92
+ manager.createRoom({
93
+ name: "Test",
94
+ description: "a".repeat(501)
95
+ })
96
+ ).rejects.toThrow("Room description too long");
97
+ });
98
+
99
+ it("should check room limit before creating private room", async () => {
100
+ manager.setRoomLimit(1);
101
+ manager.setOwnedRooms([
102
+ {
103
+ id: "room-1",
104
+ name: "Existing Room",
105
+ is_owner: true
106
+ } as RoomInfo
107
+ ]);
108
+
109
+ await expect(manager.createRoom({ name: "New Room" })).rejects.toThrow("Room limit reached");
110
+ });
111
+
112
+ it("should timeout if no response", async () => {
113
+ vi.useFakeTimers();
114
+
115
+ const createPromise = manager.createRoom({ name: "Test Room" });
116
+
117
+ vi.advanceTimersByTime(30001);
118
+
119
+ await expect(createPromise).rejects.toThrow("timeout");
120
+
121
+ vi.useRealTimers();
122
+ });
123
+
124
+ it("should handle create errors", async () => {
125
+ const createPromise = manager.createRoom({ name: "Test Room" });
126
+
127
+ setTimeout(() => {
128
+ manager.emit("room:create_error", new Error("Server error"));
129
+ }, 10);
130
+
131
+ await expect(createPromise).rejects.toThrow("Server error");
132
+ });
133
+ });
134
+
135
+ describe("updateRoom", () => {
136
+ beforeEach(() => {
137
+ manager.setOwnedRooms([
138
+ {
139
+ id: "room-123",
140
+ name: "Original Room",
141
+ is_owner: true
142
+ } as RoomInfo
143
+ ]);
144
+ });
145
+
146
+ it("should update a room successfully", async () => {
147
+ const updates = {
148
+ name: "Updated Room",
149
+ description: "Updated Description"
150
+ };
151
+
152
+ const updatedRoom: RoomInfo = {
153
+ id: "room-123",
154
+ name: updates.name,
155
+ description: updates.description,
156
+ is_owner: true
157
+ } as RoomInfo;
158
+
159
+ const updatePromise = manager.updateRoom("room-123", updates);
160
+
161
+ setTimeout(() => {
162
+ manager.emit("room:updated", updatedRoom);
163
+ }, 10);
164
+
165
+ const result = await updatePromise;
166
+
167
+ expect(result).toEqual(updatedRoom);
168
+ expect(mockWsClient.sendMessage).toHaveBeenCalledWith({
169
+ type: "update_room",
170
+ data: {
171
+ room_id: "room-123",
172
+ name: updates.name,
173
+ description: updates.description
174
+ }
175
+ });
176
+ });
177
+
178
+ it("should reject if user doesn't own room", async () => {
179
+ await expect(manager.updateRoom("room-999", { name: "New Name" })).rejects.toThrow(
180
+ "don't own this room"
181
+ );
182
+ });
183
+
184
+ it("should require at least one field", async () => {
185
+ await expect(manager.updateRoom("room-123", {})).rejects.toThrow("At least one field");
186
+ });
187
+
188
+ it("should validate updated name", async () => {
189
+ await expect(manager.updateRoom("room-123", { name: "" })).rejects.toThrow(
190
+ "Room name cannot be empty"
191
+ );
192
+ });
193
+
194
+ it("should validate updated description", async () => {
195
+ await expect(
196
+ manager.updateRoom("room-123", { description: "a".repeat(501) })
197
+ ).rejects.toThrow("Room description too long");
198
+ });
199
+ });
200
+
201
+ describe("deleteRoom", () => {
202
+ beforeEach(() => {
203
+ manager.setOwnedRooms([
204
+ {
205
+ id: "room-123",
206
+ name: "Room to Delete",
207
+ is_owner: true
208
+ } as RoomInfo
209
+ ]);
210
+ });
211
+
212
+ it("should delete a room successfully", async () => {
213
+ const deletePromise = manager.deleteRoom("room-123");
214
+
215
+ setTimeout(() => {
216
+ manager.emit("room:deleted", "room-123");
217
+ }, 10);
218
+
219
+ await expect(deletePromise).resolves.toBeUndefined();
220
+ expect(mockWsClient.sendMessage).toHaveBeenCalledWith({
221
+ type: "delete_room",
222
+ data: {
223
+ room_id: "room-123"
224
+ }
225
+ });
226
+ });
227
+
228
+ it("should reject if user doesn't own room", async () => {
229
+ await expect(manager.deleteRoom("room-999")).rejects.toThrow("don't own this room");
230
+ });
231
+
232
+ it("should handle delete errors", async () => {
233
+ const deletePromise = manager.deleteRoom("room-123");
234
+
235
+ setTimeout(() => {
236
+ manager.emit("room:delete_error", new Error("Cannot delete"), "room-123");
237
+ }, 10);
238
+
239
+ await expect(deletePromise).rejects.toThrow("Cannot delete");
240
+ });
241
+ });
242
+
243
+ describe("Query Methods", () => {
244
+ it("should return owned rooms", () => {
245
+ const ownedRooms: RoomInfo[] = [
246
+ { id: "room-1", name: "Room 1", is_owner: true } as RoomInfo,
247
+ { id: "room-2", name: "Room 2", is_owner: true } as RoomInfo
248
+ ];
249
+
250
+ manager.setOwnedRooms(ownedRooms);
251
+
252
+ const result = manager.getOwnedRooms();
253
+ expect(result).toHaveLength(2);
254
+ expect(result[0].id).toBe("room-1");
255
+ expect(result[1].id).toBe("room-2");
256
+ });
257
+
258
+ it("should return shared rooms", () => {
259
+ const sharedRooms: RoomInfo[] = [
260
+ { id: "room-3", name: "Shared 1", is_owner: false } as RoomInfo,
261
+ { id: "room-4", name: "Shared 2", is_owner: false } as RoomInfo
262
+ ];
263
+
264
+ manager.setSharedRooms(sharedRooms);
265
+
266
+ const result = manager.getSharedRooms();
267
+ expect(result).toHaveLength(2);
268
+ expect(result[0].id).toBe("room-3");
269
+ });
270
+
271
+ it("should get room by ID from owned rooms", () => {
272
+ manager.setOwnedRooms([{ id: "room-1", name: "Owned Room", is_owner: true } as RoomInfo]);
273
+
274
+ const result = manager.getRoomById("room-1");
275
+ expect(result).toBeDefined();
276
+ expect(result!.name).toBe("Owned Room");
277
+ });
278
+
279
+ it("should get room by ID from shared rooms", () => {
280
+ manager.setSharedRooms([{ id: "room-2", name: "Shared Room", is_owner: false } as RoomInfo]);
281
+
282
+ const result = manager.getRoomById("room-2");
283
+ expect(result).toBeDefined();
284
+ expect(result!.name).toBe("Shared Room");
285
+ });
286
+
287
+ it("should return undefined for non-existent room", () => {
288
+ const result = manager.getRoomById("room-999");
289
+ expect(result).toBeUndefined();
290
+ });
291
+
292
+ it("should get room limit", () => {
293
+ manager.setRoomLimit(5);
294
+ expect(manager.getRoomLimit()).toBe(5);
295
+ });
296
+
297
+ it("should get owned room count", () => {
298
+ manager.setOwnedRooms([
299
+ { id: "room-1", name: "Room 1", is_owner: true } as RoomInfo,
300
+ { id: "room-2", name: "Room 2", is_owner: true } as RoomInfo,
301
+ { id: "room-3", name: "Room 3", is_owner: true } as RoomInfo
302
+ ]);
303
+
304
+ expect(manager.getOwnedRoomCount()).toBe(3);
305
+ });
306
+
307
+ it("should check if can create room", () => {
308
+ manager.setRoomLimit(3);
309
+ manager.setOwnedRooms([
310
+ { id: "room-1", name: "Room 1", is_owner: true } as RoomInfo,
311
+ { id: "room-2", name: "Room 2", is_owner: true } as RoomInfo
312
+ ]);
313
+
314
+ expect(manager.canCreateRoom()).toBe(true);
315
+
316
+ manager.setOwnedRooms([
317
+ { id: "room-1", name: "Room 1", is_owner: true } as RoomInfo,
318
+ { id: "room-2", name: "Room 2", is_owner: true } as RoomInfo,
319
+ { id: "room-3", name: "Room 3", is_owner: true } as RoomInfo
320
+ ]);
321
+
322
+ expect(manager.canCreateRoom()).toBe(false);
323
+ });
324
+ });
325
+
326
+ describe("Cache Management", () => {
327
+ it("should upsert owned room", () => {
328
+ const room: RoomInfo = {
329
+ id: "room-1",
330
+ name: "New Room",
331
+ is_owner: true
332
+ } as RoomInfo;
333
+
334
+ manager.upsertRoom(room);
335
+
336
+ const result = manager.getRoomById("room-1");
337
+ expect(result).toBeDefined();
338
+ expect(result!.name).toBe("New Room");
339
+ expect(manager.getOwnedRoomCount()).toBe(1);
340
+ });
341
+
342
+ it("should upsert shared room", () => {
343
+ const room: RoomInfo = {
344
+ id: "room-2",
345
+ name: "Shared Room",
346
+ is_owner: false
347
+ } as RoomInfo;
348
+
349
+ manager.upsertRoom(room);
350
+
351
+ const result = manager.getRoomById("room-2");
352
+ expect(result).toBeDefined();
353
+ expect(result!.name).toBe("Shared Room");
354
+ expect(manager.getSharedRooms()).toHaveLength(1);
355
+ expect(manager.getOwnedRoomCount()).toBe(0);
356
+ });
357
+
358
+ it("should move room from shared to owned when ownership changes", () => {
359
+ const room: RoomInfo = {
360
+ id: "room-1",
361
+ name: "Room",
362
+ is_owner: false
363
+ } as RoomInfo;
364
+
365
+ manager.upsertRoom(room);
366
+ expect(manager.getSharedRooms()).toHaveLength(1);
367
+ expect(manager.getOwnedRoomCount()).toBe(0);
368
+
369
+ // Update to owned
370
+ room.is_owner = true;
371
+ manager.upsertRoom(room);
372
+ expect(manager.getSharedRooms()).toHaveLength(0);
373
+ expect(manager.getOwnedRoomCount()).toBe(1);
374
+ });
375
+
376
+ it("should remove room from cache", () => {
377
+ manager.setOwnedRooms([{ id: "room-1", name: "Room 1", is_owner: true } as RoomInfo]);
378
+
379
+ expect(manager.getRoomById("room-1")).toBeDefined();
380
+
381
+ manager.removeRoom("room-1");
382
+
383
+ expect(manager.getRoomById("room-1")).toBeUndefined();
384
+ expect(manager.getOwnedRoomCount()).toBe(0);
385
+ });
386
+
387
+ it("should clear all caches", () => {
388
+ manager.setRoomLimit(5);
389
+ manager.setOwnedRooms([{ id: "room-1", name: "Room 1", is_owner: true } as RoomInfo]);
390
+ manager.setSharedRooms([{ id: "room-2", name: "Room 2", is_owner: false } as RoomInfo]);
391
+
392
+ manager.clearCaches();
393
+
394
+ expect(manager.getOwnedRoomCount()).toBe(0);
395
+ expect(manager.getSharedRooms()).toHaveLength(0);
396
+ expect(manager.getRoomLimit()).toBe(1); // Reset to default
397
+ });
398
+ });
399
+
400
+ describe("Return Value Immutability", () => {
401
+ it("should return defensive copies from getOwnedRooms", () => {
402
+ manager.setOwnedRooms([{ id: "room-1", name: "Room 1", is_owner: true } as RoomInfo]);
403
+
404
+ const rooms1 = manager.getOwnedRooms();
405
+ const rooms2 = manager.getOwnedRooms();
406
+
407
+ expect(rooms1).not.toBe(rooms2);
408
+ expect(rooms1[0]).not.toBe(rooms2[0]);
409
+ });
410
+
411
+ it("should return defensive copy from getRoomById", () => {
412
+ manager.setOwnedRooms([{ id: "room-1", name: "Room 1", is_owner: true } as RoomInfo]);
413
+
414
+ const room1 = manager.getRoomById("room-1");
415
+ const room2 = manager.getRoomById("room-1");
416
+
417
+ expect(room1).not.toBe(room2);
418
+ });
419
+ });
420
+ });
package/tsconfig.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "target": "ES2020",
3
+ "target": "ES2022",
4
4
  "module": "commonjs",
5
- "lib": ["ES2020"],
5
+ "lib": ["ES2022", "DOM"],
6
6
  "outDir": "./dist",
7
7
  "rootDir": "./src",
8
8
  "strict": true,
package/vitest.config.ts CHANGED
@@ -25,6 +25,7 @@ export default defineConfig({
25
25
  }
26
26
  },
27
27
  include: ["src/**/*.test.ts", "src/**/*.spec.ts", "tests/**/*.test.ts", "tests/**/*.spec.ts"],
28
+ exclude: ["tests/integration/**"],
28
29
  setupFiles: ["./tests/setup.ts"],
29
30
  testTimeout: 10000,
30
31
  hookTimeout: 10000