@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,403 @@
1
+ /**
2
+ * Unit tests for AgentStatusUpdateHandler
3
+ * Tests real-time agent status update handling and cache invalidation
4
+ */
5
+
6
+ import { describe, it, expect, beforeEach, vi } from "vitest";
7
+ import { AgentStatusUpdateHandler } from "../../../src/handlers/message-handlers/agent-status-update-handler";
8
+ import { HandlerContext } from "../../../src/handlers/message-handlers/types";
9
+ import { Logger } from "../../../src/types";
10
+
11
+ describe("AgentStatusUpdateHandler", () => {
12
+ let handler: AgentStatusUpdateHandler;
13
+ let mockContext: HandlerContext;
14
+ let mockLogger: Logger;
15
+ let mockAgentRoomManager: any;
16
+ let emitSpy: ReturnType<typeof vi.fn>;
17
+ let sendWebhookSpy: ReturnType<typeof vi.fn>;
18
+
19
+ beforeEach(() => {
20
+ // Create mock logger
21
+ mockLogger = {
22
+ debug: vi.fn(),
23
+ info: vi.fn(),
24
+ warn: vi.fn(),
25
+ error: vi.fn()
26
+ };
27
+
28
+ // Create mock agent room manager
29
+ mockAgentRoomManager = {
30
+ handleStatusUpdate: vi.fn()
31
+ };
32
+
33
+ // Create spies
34
+ emitSpy = vi.fn();
35
+ sendWebhookSpy = vi.fn().mockResolvedValue(undefined);
36
+
37
+ // Create mock context
38
+ mockContext = {
39
+ emit: emitSpy,
40
+ sendWebhook: sendWebhookSpy,
41
+ logger: mockLogger,
42
+ getConnectionState: vi.fn(),
43
+ getAuthState: vi.fn(),
44
+ updateConnectionState: vi.fn(),
45
+ updateAuthState: vi.fn(),
46
+ sendMessage: vi.fn(),
47
+ agentRoomManager: mockAgentRoomManager
48
+ } as any;
49
+
50
+ // Create handler instance
51
+ handler = new AgentStatusUpdateHandler();
52
+ });
53
+
54
+ describe("Handler Metadata", () => {
55
+ it("should have correct type", () => {
56
+ expect(handler.type).toBe("agent_status_update");
57
+ });
58
+
59
+ it("should have schema defined", () => {
60
+ expect(handler.schema).toBeDefined();
61
+ });
62
+
63
+ it("should identify messages it can handle", () => {
64
+ const message = { type: "agent_status_update", data: {} };
65
+ expect(handler.canHandle(message as any)).toBe(true);
66
+ });
67
+
68
+ it("should not handle other message types", () => {
69
+ const message = { type: "other_type", data: {} };
70
+ expect(handler.canHandle(message as any)).toBe(false);
71
+ });
72
+ });
73
+
74
+ describe("Status Update Handling", () => {
75
+ it("should handle agent status update", async () => {
76
+ const message = {
77
+ type: "agent_status_update" as const,
78
+ data: {
79
+ room_id: "room-123",
80
+ agent_id: "agent-456",
81
+ status: "offline"
82
+ }
83
+ };
84
+
85
+ await handler.handle(message, mockContext);
86
+
87
+ // Should invalidate cache via agent room manager
88
+ expect(mockAgentRoomManager.handleStatusUpdate).toHaveBeenCalledWith(
89
+ "room-123",
90
+ "agent-456",
91
+ "offline"
92
+ );
93
+
94
+ // Should emit event
95
+ expect(emitSpy).toHaveBeenCalledWith("agent_room:status_update", {
96
+ roomId: "room-123",
97
+ agentId: "agent-456",
98
+ status: "offline",
99
+ agent: undefined
100
+ });
101
+
102
+ // Should send webhook
103
+ expect(sendWebhookSpy).toHaveBeenCalledWith(
104
+ "agent_status_update",
105
+ expect.objectContaining({
106
+ room_id: "room-123",
107
+ agent_id: "agent-456",
108
+ status: "offline"
109
+ }),
110
+ undefined
111
+ );
112
+
113
+ // Should log
114
+ expect(mockLogger.info).toHaveBeenCalledWith(
115
+ "Agent status updated",
116
+ expect.objectContaining({
117
+ roomId: "room-123",
118
+ agentId: "agent-456",
119
+ status: "offline"
120
+ })
121
+ );
122
+ });
123
+
124
+ it("should handle status update with agent details", async () => {
125
+ const agentDetails = {
126
+ agent_id: "agent-456",
127
+ agent_name: "Weather Agent",
128
+ description: "Provides weather info",
129
+ status: "online"
130
+ };
131
+
132
+ const message = {
133
+ type: "agent_status_update" as const,
134
+ data: {
135
+ room_id: "room-123",
136
+ agent_id: "agent-456",
137
+ status: "online",
138
+ agent: agentDetails
139
+ }
140
+ };
141
+
142
+ await handler.handle(message, mockContext);
143
+
144
+ // Should emit event with agent details
145
+ expect(emitSpy).toHaveBeenCalledWith("agent_room:status_update", {
146
+ roomId: "room-123",
147
+ agentId: "agent-456",
148
+ status: "online",
149
+ agent: agentDetails
150
+ });
151
+ });
152
+
153
+ it("should handle online status", async () => {
154
+ const message = {
155
+ type: "agent_status_update" as const,
156
+ data: {
157
+ room_id: "room-789",
158
+ agent_id: "agent-999",
159
+ status: "online"
160
+ }
161
+ };
162
+
163
+ await handler.handle(message, mockContext);
164
+
165
+ expect(mockAgentRoomManager.handleStatusUpdate).toHaveBeenCalledWith(
166
+ "room-789",
167
+ "agent-999",
168
+ "online"
169
+ );
170
+ });
171
+
172
+ it("should work without agentRoomManager in context", async () => {
173
+ const contextWithoutManager = { ...mockContext, agentRoomManager: undefined };
174
+
175
+ const message = {
176
+ type: "agent_status_update" as const,
177
+ data: {
178
+ room_id: "room-123",
179
+ agent_id: "agent-456",
180
+ status: "offline"
181
+ }
182
+ };
183
+
184
+ await handler.handle(message, contextWithoutManager);
185
+
186
+ // Should still emit event
187
+ expect(emitSpy).toHaveBeenCalledWith("agent_room:status_update", {
188
+ roomId: "room-123",
189
+ agentId: "agent-456",
190
+ status: "offline",
191
+ agent: undefined
192
+ });
193
+ });
194
+
195
+ it("should work with agentRoomManager without handleStatusUpdate method", async () => {
196
+ const invalidManager = { someOtherMethod: vi.fn() };
197
+ const contextWithInvalidManager = {
198
+ ...mockContext,
199
+ agentRoomManager: invalidManager
200
+ };
201
+
202
+ const message = {
203
+ type: "agent_status_update" as const,
204
+ data: {
205
+ room_id: "room-123",
206
+ agent_id: "agent-456",
207
+ status: "offline"
208
+ }
209
+ };
210
+
211
+ // Should not throw
212
+ await handler.handle(message, contextWithInvalidManager);
213
+
214
+ // Should still emit event
215
+ expect(emitSpy).toHaveBeenCalledWith("agent_room:status_update", {
216
+ roomId: "room-123",
217
+ agentId: "agent-456",
218
+ status: "offline",
219
+ agent: undefined
220
+ });
221
+ });
222
+ });
223
+
224
+ describe("Webhook Errors", () => {
225
+ it("should handle webhook failures gracefully", async () => {
226
+ const webhookError = new Error("Webhook failed");
227
+ sendWebhookSpy.mockRejectedValueOnce(webhookError);
228
+
229
+ const message = {
230
+ type: "agent_status_update" as const,
231
+ data: {
232
+ room_id: "room-123",
233
+ agent_id: "agent-456",
234
+ status: "offline"
235
+ }
236
+ };
237
+
238
+ // Should not throw
239
+ await handler.handle(message, mockContext);
240
+
241
+ // Should still emit event and invalidate cache
242
+ expect(emitSpy).toHaveBeenCalledWith("agent_room:status_update", expect.any(Object));
243
+ expect(mockAgentRoomManager.handleStatusUpdate).toHaveBeenCalled();
244
+ });
245
+ });
246
+
247
+ describe("Message Validation", () => {
248
+ it("should handle invalid message structure", async () => {
249
+ const invalidMessage = {
250
+ type: "agent_status_update"
251
+ // Missing data field
252
+ } as any;
253
+
254
+ await handler.handle(invalidMessage, mockContext);
255
+
256
+ // Should log error
257
+ expect(mockLogger.error).toHaveBeenCalledWith(
258
+ expect.stringContaining("Error handling agent_status_update"),
259
+ expect.any(Error)
260
+ );
261
+
262
+ // Should emit message:error event
263
+ expect(emitSpy).toHaveBeenCalledWith("message:error", expect.any(Error), invalidMessage);
264
+ });
265
+
266
+ it("should accept valid message with extra fields", async () => {
267
+ const message = {
268
+ type: "agent_status_update" as const,
269
+ data: {
270
+ room_id: "room-123",
271
+ agent_id: "agent-456",
272
+ status: "online",
273
+ extra_field: "should be ignored",
274
+ another_extra: 123
275
+ }
276
+ };
277
+
278
+ // Should not throw
279
+ await handler.handle(message, mockContext);
280
+
281
+ expect(emitSpy).toHaveBeenCalledWith("agent_room:status_update", expect.any(Object));
282
+ });
283
+ });
284
+
285
+ describe("Debug Logging", () => {
286
+ it("should log debug info", async () => {
287
+ const message = {
288
+ type: "agent_status_update" as const,
289
+ data: {
290
+ room_id: "room-123",
291
+ agent_id: "agent-456",
292
+ status: "offline"
293
+ }
294
+ };
295
+
296
+ await handler.handle(message, mockContext);
297
+
298
+ expect(mockLogger.debug).toHaveBeenCalledWith(
299
+ "Handling agent_status_update",
300
+ expect.objectContaining({
301
+ roomId: "room-123",
302
+ agentId: "agent-456",
303
+ status: "offline"
304
+ })
305
+ );
306
+ });
307
+
308
+ it("should log debug info with agent details", async () => {
309
+ const message = {
310
+ type: "agent_status_update" as const,
311
+ data: {
312
+ room_id: "room-123",
313
+ agent_id: "agent-456",
314
+ status: "online",
315
+ agent: {
316
+ agent_id: "agent-456",
317
+ agent_name: "Test Agent"
318
+ }
319
+ }
320
+ };
321
+
322
+ await handler.handle(message, mockContext);
323
+
324
+ expect(mockLogger.debug).toHaveBeenCalledWith(
325
+ "Handling agent_status_update",
326
+ expect.objectContaining({
327
+ roomId: "room-123",
328
+ agentId: "agent-456",
329
+ status: "online",
330
+ hasAgent: true
331
+ })
332
+ );
333
+ });
334
+ });
335
+
336
+ describe("Multiple Status Updates", () => {
337
+ it("should handle multiple status updates for different agents", async () => {
338
+ const message1 = {
339
+ type: "agent_status_update" as const,
340
+ data: {
341
+ room_id: "room-123",
342
+ agent_id: "agent-1",
343
+ status: "offline"
344
+ }
345
+ };
346
+
347
+ const message2 = {
348
+ type: "agent_status_update" as const,
349
+ data: {
350
+ room_id: "room-123",
351
+ agent_id: "agent-2",
352
+ status: "online"
353
+ }
354
+ };
355
+
356
+ await handler.handle(message1, mockContext);
357
+ await handler.handle(message2, mockContext);
358
+
359
+ expect(mockAgentRoomManager.handleStatusUpdate).toHaveBeenCalledTimes(2);
360
+ expect(mockAgentRoomManager.handleStatusUpdate).toHaveBeenCalledWith(
361
+ "room-123",
362
+ "agent-1",
363
+ "offline"
364
+ );
365
+ expect(mockAgentRoomManager.handleStatusUpdate).toHaveBeenCalledWith(
366
+ "room-123",
367
+ "agent-2",
368
+ "online"
369
+ );
370
+ });
371
+
372
+ it("should handle multiple status updates for same agent", async () => {
373
+ const message1 = {
374
+ type: "agent_status_update" as const,
375
+ data: {
376
+ room_id: "room-123",
377
+ agent_id: "agent-1",
378
+ status: "online"
379
+ }
380
+ };
381
+
382
+ const message2 = {
383
+ type: "agent_status_update" as const,
384
+ data: {
385
+ room_id: "room-123",
386
+ agent_id: "agent-1",
387
+ status: "offline"
388
+ }
389
+ };
390
+
391
+ await handler.handle(message1, mockContext);
392
+ await handler.handle(message2, mockContext);
393
+
394
+ expect(mockAgentRoomManager.handleStatusUpdate).toHaveBeenCalledTimes(2);
395
+ // Last call should be offline
396
+ expect(mockAgentRoomManager.handleStatusUpdate).toHaveBeenLastCalledWith(
397
+ "room-123",
398
+ "agent-1",
399
+ "offline"
400
+ );
401
+ });
402
+ });
403
+ });