@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,500 @@
1
+ /**
2
+ * Unit tests for RoomOperationResponseHandler
3
+ * Tests response handling for room CRUD operations
4
+ */
5
+
6
+ import { describe, it, expect, beforeEach, vi } from "vitest";
7
+ import { RoomOperationResponseHandler } from "../../../src/handlers/message-handlers/room-operation-response-handler";
8
+ import { HandlerContext } from "../../../src/handlers/message-handlers/types";
9
+ import { RoomInfo, Logger } from "../../../src/types";
10
+ import { SDKError } from "../../../src/types/events";
11
+ import { ErrorCode } from "../../../src/types/error-codes";
12
+
13
+ describe("RoomOperationResponseHandler", () => {
14
+ let handler: RoomOperationResponseHandler;
15
+ let mockContext: HandlerContext;
16
+ let mockLogger: Logger;
17
+ let mockRoomManagementManager: any;
18
+ let emitSpy: ReturnType<typeof vi.fn>;
19
+ let sendWebhookSpy: 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
+ upsertRoom: vi.fn(),
33
+ removeRoom: vi.fn()
34
+ };
35
+
36
+ // Create spies
37
+ emitSpy = vi.fn();
38
+ sendWebhookSpy = vi.fn().mockResolvedValue(undefined);
39
+
40
+ // Create mock context
41
+ mockContext = {
42
+ emit: emitSpy,
43
+ sendWebhook: sendWebhookSpy,
44
+ logger: mockLogger,
45
+ getConnectionState: vi.fn(),
46
+ getAuthState: vi.fn(),
47
+ updateConnectionState: vi.fn(),
48
+ updateAuthState: vi.fn(),
49
+ sendMessage: vi.fn(),
50
+ roomManagementManager: mockRoomManagementManager
51
+ };
52
+
53
+ // Create handler instance
54
+ handler = new RoomOperationResponseHandler();
55
+ });
56
+
57
+ describe("Handler Metadata", () => {
58
+ it("should have correct type", () => {
59
+ expect(handler.type).toBe("room_operation_response");
60
+ });
61
+
62
+ it("should have schema defined", () => {
63
+ expect(handler.schema).toBeDefined();
64
+ });
65
+
66
+ it("should identify messages it can handle", () => {
67
+ const message = { type: "room_operation_response", data: {} };
68
+ expect(handler.canHandle(message as any)).toBe(true);
69
+ });
70
+
71
+ it("should not handle other message types", () => {
72
+ const message = { type: "other_type", data: {} };
73
+ expect(handler.canHandle(message as any)).toBe(false);
74
+ });
75
+ });
76
+
77
+ describe("Success Responses - Create/Update (with room object)", () => {
78
+ it("should handle successful create/update with room object", async () => {
79
+ const room: RoomInfo = {
80
+ id: "room-123",
81
+ name: "Test Room",
82
+ description: "Test Description",
83
+ is_public: false,
84
+ created_by: "user-123",
85
+ created_at: new Date().toISOString(),
86
+ updated_at: new Date().toISOString(),
87
+ is_owner: true
88
+ };
89
+
90
+ const message = {
91
+ type: "room_operation_response" as const,
92
+ data: {
93
+ success: true,
94
+ room
95
+ }
96
+ };
97
+
98
+ await handler.handle(message, mockContext);
99
+
100
+ // Should update cache
101
+ expect(mockRoomManagementManager.upsertRoom).toHaveBeenCalledWith(room);
102
+
103
+ // Should emit both created and updated events
104
+ expect(emitSpy).toHaveBeenCalledWith("room:created", room);
105
+ expect(emitSpy).toHaveBeenCalledWith("room:updated", room);
106
+
107
+ // Should send webhook
108
+ expect(sendWebhookSpy).toHaveBeenCalledWith(
109
+ "room_operation",
110
+ expect.objectContaining({
111
+ success: true,
112
+ room
113
+ }),
114
+ undefined
115
+ );
116
+
117
+ // Should log
118
+ expect(mockLogger.info).toHaveBeenCalledWith(
119
+ "Room operation succeeded",
120
+ expect.objectContaining({
121
+ roomId: room.id,
122
+ roomName: room.name
123
+ })
124
+ );
125
+ });
126
+
127
+ it("should handle success with minimal room data", async () => {
128
+ const room: RoomInfo = {
129
+ id: "room-456",
130
+ name: "Minimal Room",
131
+ is_owner: false
132
+ } as RoomInfo;
133
+
134
+ const message = {
135
+ type: "room_operation_response" as const,
136
+ data: {
137
+ success: true,
138
+ room
139
+ }
140
+ };
141
+
142
+ await handler.handle(message, mockContext);
143
+
144
+ expect(mockRoomManagementManager.upsertRoom).toHaveBeenCalledWith(room);
145
+ expect(emitSpy).toHaveBeenCalledWith("room:created", room);
146
+ expect(emitSpy).toHaveBeenCalledWith("room:updated", room);
147
+ });
148
+
149
+ it("should work without roomManagementManager in context", async () => {
150
+ const contextWithoutManager = { ...mockContext, roomManagementManager: undefined };
151
+ const room: RoomInfo = {
152
+ id: "room-789",
153
+ name: "Test Room",
154
+ is_owner: true
155
+ } as RoomInfo;
156
+
157
+ const message = {
158
+ type: "room_operation_response" as const,
159
+ data: {
160
+ success: true,
161
+ room
162
+ }
163
+ };
164
+
165
+ await handler.handle(message, contextWithoutManager);
166
+
167
+ // Should still emit events
168
+ expect(emitSpy).toHaveBeenCalledWith("room:created", room);
169
+ expect(emitSpy).toHaveBeenCalledWith("room:updated", room);
170
+ });
171
+ });
172
+
173
+ describe("Success Responses - Delete (with room_id only)", () => {
174
+ it("should handle successful delete with room_id", async () => {
175
+ const roomId = "room-123";
176
+
177
+ const message = {
178
+ type: "room_operation_response" as const,
179
+ data: {
180
+ success: true,
181
+ room_id: roomId
182
+ }
183
+ };
184
+
185
+ await handler.handle(message, mockContext);
186
+
187
+ // Should remove from cache
188
+ expect(mockRoomManagementManager.removeRoom).toHaveBeenCalledWith(roomId);
189
+
190
+ // Should emit deleted event
191
+ expect(emitSpy).toHaveBeenCalledWith("room:deleted", roomId);
192
+
193
+ // Should send webhook
194
+ expect(sendWebhookSpy).toHaveBeenCalledWith(
195
+ "room_deleted",
196
+ expect.objectContaining({
197
+ success: true,
198
+ room_id: roomId
199
+ }),
200
+ undefined
201
+ );
202
+
203
+ // Should log
204
+ expect(mockLogger.info).toHaveBeenCalledWith("Room deleted", { roomId });
205
+ });
206
+
207
+ it("should work without roomManagementManager for delete", async () => {
208
+ const contextWithoutManager = { ...mockContext, roomManagementManager: undefined };
209
+ const roomId = "room-456";
210
+
211
+ const message = {
212
+ type: "room_operation_response" as const,
213
+ data: {
214
+ success: true,
215
+ room_id: roomId
216
+ }
217
+ };
218
+
219
+ await handler.handle(message, contextWithoutManager);
220
+
221
+ // Should still emit event
222
+ expect(emitSpy).toHaveBeenCalledWith("room:deleted", roomId);
223
+ });
224
+ });
225
+
226
+ describe("Error Responses", () => {
227
+ it("should handle error response with message", async () => {
228
+ const errorMessage = "Room name already exists";
229
+ const roomId = "room-123";
230
+
231
+ const message = {
232
+ type: "room_operation_response" as const,
233
+ data: {
234
+ success: false,
235
+ message: errorMessage,
236
+ room_id: roomId
237
+ }
238
+ };
239
+
240
+ await handler.handle(message, mockContext);
241
+
242
+ // Should emit all error events (since we can't determine operation type)
243
+ expect(emitSpy).toHaveBeenCalledWith("room:create_error", expect.any(SDKError));
244
+ expect(emitSpy).toHaveBeenCalledWith("room:update_error", expect.any(SDKError), roomId);
245
+ expect(emitSpy).toHaveBeenCalledWith("room:delete_error", expect.any(SDKError), roomId);
246
+
247
+ // Verify error details
248
+ const createErrorCall = emitSpy.mock.calls.find((call) => call[0] === "room:create_error");
249
+ const error = createErrorCall[1] as SDKError;
250
+ expect(error.message).toBe(errorMessage);
251
+ expect(error.code).toBe(ErrorCode.OPERATION_FAILED);
252
+
253
+ // Should send webhook
254
+ expect(sendWebhookSpy).toHaveBeenCalledWith(
255
+ "room_operation_error",
256
+ expect.objectContaining({
257
+ success: false,
258
+ message: errorMessage,
259
+ room_id: roomId
260
+ }),
261
+ undefined
262
+ );
263
+
264
+ // Should not update cache
265
+ expect(mockRoomManagementManager.upsertRoom).not.toHaveBeenCalled();
266
+ expect(mockRoomManagementManager.removeRoom).not.toHaveBeenCalled();
267
+ });
268
+
269
+ it("should handle error without message", async () => {
270
+ const message = {
271
+ type: "room_operation_response" as const,
272
+ data: {
273
+ success: false
274
+ }
275
+ };
276
+
277
+ await handler.handle(message, mockContext);
278
+
279
+ // Should use default error message
280
+ const createErrorCall = emitSpy.mock.calls.find((call) => call[0] === "room:create_error");
281
+ const error = createErrorCall[1] as SDKError;
282
+ expect(error.message).toBe("Room operation failed");
283
+ });
284
+
285
+ it("should handle error without room_id", async () => {
286
+ const message = {
287
+ type: "room_operation_response" as const,
288
+ data: {
289
+ success: false,
290
+ message: "Generic error"
291
+ }
292
+ };
293
+
294
+ await handler.handle(message, mockContext);
295
+
296
+ // Should still emit error events
297
+ expect(emitSpy).toHaveBeenCalledWith("room:create_error", expect.any(SDKError));
298
+ expect(emitSpy).toHaveBeenCalledWith("room:update_error", expect.any(SDKError), undefined);
299
+ expect(emitSpy).toHaveBeenCalledWith("room:delete_error", expect.any(SDKError), undefined);
300
+ });
301
+ });
302
+
303
+ describe("Edge Cases", () => {
304
+ it("should handle success without room or room_id", async () => {
305
+ const message = {
306
+ type: "room_operation_response" as const,
307
+ data: {
308
+ success: true
309
+ }
310
+ };
311
+
312
+ await handler.handle(message, mockContext);
313
+
314
+ // Should log warning
315
+ expect(mockLogger.warn).toHaveBeenCalledWith(
316
+ "Room operation succeeded but no room data provided"
317
+ );
318
+
319
+ // Should not emit any success events
320
+ expect(emitSpy).not.toHaveBeenCalledWith("room:created", expect.anything());
321
+ expect(emitSpy).not.toHaveBeenCalledWith("room:updated", expect.anything());
322
+ expect(emitSpy).not.toHaveBeenCalledWith("room:deleted", expect.anything());
323
+
324
+ // Should not update cache
325
+ expect(mockRoomManagementManager.upsertRoom).not.toHaveBeenCalled();
326
+ expect(mockRoomManagementManager.removeRoom).not.toHaveBeenCalled();
327
+ });
328
+
329
+ it("should handle roomManagementManager without upsertRoom method", async () => {
330
+ const invalidManager = { someOtherMethod: vi.fn() };
331
+ const contextWithInvalidManager = {
332
+ ...mockContext,
333
+ roomManagementManager: invalidManager
334
+ };
335
+
336
+ const room: RoomInfo = {
337
+ id: "room-123",
338
+ name: "Test Room",
339
+ is_owner: true
340
+ } as RoomInfo;
341
+
342
+ const message = {
343
+ type: "room_operation_response" as const,
344
+ data: {
345
+ success: true,
346
+ room
347
+ }
348
+ };
349
+
350
+ // Should not throw
351
+ await handler.handle(message, contextWithInvalidManager);
352
+
353
+ // Should still emit events
354
+ expect(emitSpy).toHaveBeenCalledWith("room:created", room);
355
+ });
356
+
357
+ it("should handle roomManagementManager without removeRoom method", async () => {
358
+ const invalidManager = { someOtherMethod: vi.fn() };
359
+ const contextWithInvalidManager = {
360
+ ...mockContext,
361
+ roomManagementManager: invalidManager
362
+ };
363
+
364
+ const message = {
365
+ type: "room_operation_response" as const,
366
+ data: {
367
+ success: true,
368
+ room_id: "room-123"
369
+ }
370
+ };
371
+
372
+ // Should not throw
373
+ await handler.handle(message, contextWithInvalidManager);
374
+
375
+ // Should still emit event
376
+ expect(emitSpy).toHaveBeenCalledWith("room:deleted", "room-123");
377
+ });
378
+ });
379
+
380
+ describe("Webhook Errors", () => {
381
+ it("should handle webhook failures gracefully", async () => {
382
+ const webhookError = new Error("Webhook failed");
383
+ sendWebhookSpy.mockRejectedValueOnce(webhookError);
384
+
385
+ const room: RoomInfo = {
386
+ id: "room-123",
387
+ name: "Test Room",
388
+ is_owner: true
389
+ } as RoomInfo;
390
+
391
+ const message = {
392
+ type: "room_operation_response" as const,
393
+ data: {
394
+ success: true,
395
+ room
396
+ }
397
+ };
398
+
399
+ // Should not throw (webhook errors are logged but don't fail the handler)
400
+ await handler.handle(message, mockContext);
401
+
402
+ // Should still emit events and update cache
403
+ expect(emitSpy).toHaveBeenCalledWith("room:created", room);
404
+ expect(mockRoomManagementManager.upsertRoom).toHaveBeenCalledWith(room);
405
+ });
406
+ });
407
+
408
+ describe("Message Validation", () => {
409
+ it("should handle invalid message structure", async () => {
410
+ const invalidMessage = {
411
+ type: "room_operation_response"
412
+ // Missing data field
413
+ } as any;
414
+
415
+ await handler.handle(invalidMessage, mockContext);
416
+
417
+ // Should log error
418
+ expect(mockLogger.error).toHaveBeenCalledWith(
419
+ expect.stringContaining("Error handling room_operation_response"),
420
+ expect.any(Error)
421
+ );
422
+
423
+ // Should emit message:error event
424
+ expect(emitSpy).toHaveBeenCalledWith("message:error", expect.any(Error), invalidMessage);
425
+ });
426
+
427
+ it("should accept valid message with extra fields", async () => {
428
+ const room: RoomInfo = {
429
+ id: "room-123",
430
+ name: "Test Room",
431
+ is_owner: true
432
+ } as RoomInfo;
433
+
434
+ const message = {
435
+ type: "room_operation_response" as const,
436
+ data: {
437
+ success: true,
438
+ room,
439
+ extra_field: "should be ignored", // Schema uses .passthrough()
440
+ another_extra: 123
441
+ }
442
+ };
443
+
444
+ // Should not throw
445
+ await handler.handle(message, mockContext);
446
+
447
+ expect(emitSpy).toHaveBeenCalledWith("room:created", room);
448
+ });
449
+ });
450
+
451
+ describe("Debug Logging", () => {
452
+ it("should log debug info for successful operation", async () => {
453
+ const room: RoomInfo = {
454
+ id: "room-123",
455
+ name: "Test Room",
456
+ is_owner: true
457
+ } as RoomInfo;
458
+
459
+ const message = {
460
+ type: "room_operation_response" as const,
461
+ data: {
462
+ success: true,
463
+ room
464
+ }
465
+ };
466
+
467
+ await handler.handle(message, mockContext);
468
+
469
+ expect(mockLogger.debug).toHaveBeenCalledWith(
470
+ "Handling room_operation_response",
471
+ expect.objectContaining({
472
+ success: true,
473
+ roomId: undefined, // room_id is undefined in this case
474
+ hasRoom: true
475
+ })
476
+ );
477
+ });
478
+
479
+ it("should log debug info for delete operation", async () => {
480
+ const message = {
481
+ type: "room_operation_response" as const,
482
+ data: {
483
+ success: true,
484
+ room_id: "room-456"
485
+ }
486
+ };
487
+
488
+ await handler.handle(message, mockContext);
489
+
490
+ expect(mockLogger.debug).toHaveBeenCalledWith(
491
+ "Handling room_operation_response",
492
+ expect.objectContaining({
493
+ success: true,
494
+ roomId: "room-456",
495
+ hasRoom: false
496
+ })
497
+ );
498
+ });
499
+ });
500
+ });