@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
@@ -1,8 +1,8 @@
1
1
  # Teneo SDK Examples - Environment Configuration
2
2
  # Copy this file to .env and fill in your actual values
3
3
 
4
- # Required: WebSocket URL for Teneo network
5
- WS_URL=wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws
4
+ # Required: WebSocket URL for Teneo Protocol
5
+ WS_URL=wss://your-teneo-server.com/ws
6
6
 
7
7
  # Required: Your Ethereum private key (keep this secret!)
8
8
  PRIVATE_KEY=your-private-key-here
@@ -14,8 +14,7 @@ import "dotenv/config";
14
14
  import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
15
15
 
16
16
  // Load configuration from environment
17
- const WS_URL =
18
- process.env.WS_URL || "wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws";
17
+ const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
19
18
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
20
19
  const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
21
20
 
@@ -80,8 +79,8 @@ async function main() {
80
79
  console.log("✅ Event listeners configured\n");
81
80
 
82
81
  try {
83
- // Step 4: Connect to Teneo network
84
- console.log("⚙️ Step 4: Connecting to Teneo network...");
82
+ // Step 4: Connect to Teneo Protocol
83
+ console.log("⚙️ Step 4: Connecting to Teneo Protocol...");
85
84
  await sdk.connect();
86
85
  console.log("✅ Connected and authenticated!\n");
87
86
 
@@ -14,8 +14,7 @@ import "dotenv/config";
14
14
  import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
15
15
 
16
16
  // Load configuration from environment
17
- const WS_URL =
18
- process.env.WS_URL || "wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws";
17
+ const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
19
18
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
20
19
  const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
21
20
 
@@ -44,7 +43,7 @@ async function main() {
44
43
 
45
44
  try {
46
45
  // Connect to Teneo
47
- console.log("🔌 Connecting to Teneo network...");
46
+ console.log("🔌 Connecting to Teneo Protocol...");
48
47
  await sdk.connect();
49
48
  console.log("✅ Connected!\n");
50
49
 
@@ -15,8 +15,7 @@ import "dotenv/config";
15
15
  import { TeneoSDK, SDKConfigBuilder, FormattedResponse } from "../../dist/index.js";
16
16
 
17
17
  // Load configuration from environment
18
- const WS_URL =
19
- process.env.WS_URL || "wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws";
18
+ const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
20
19
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
21
20
  const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
22
21
 
@@ -52,7 +51,7 @@ async function main() {
52
51
 
53
52
  try {
54
53
  // Connect
55
- console.log("🔌 Connecting to Teneo network...");
54
+ console.log("🔌 Connecting to Teneo Protocol...");
56
55
  await sdk.connect();
57
56
  console.log("✅ Connected!\n");
58
57
 
@@ -15,8 +15,7 @@ import "dotenv/config";
15
15
  import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
16
16
 
17
17
  // Load configuration from environment
18
- const WS_URL =
19
- process.env.WS_URL || "wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws";
18
+ const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
20
19
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
21
20
  const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
22
21
 
@@ -40,7 +39,7 @@ async function main() {
40
39
 
41
40
  try {
42
41
  // Connect
43
- console.log("🔌 Connecting to Teneo network...");
42
+ console.log("🔌 Connecting to Teneo Protocol...");
44
43
  await sdk.connect();
45
44
  console.log("✅ Connected!\n");
46
45
 
@@ -26,8 +26,7 @@ import express from "express";
26
26
  import type { Request, Response } from "express";
27
27
 
28
28
  // Load configuration from environment
29
- const WS_URL =
30
- process.env.WS_URL || "wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws";
29
+ const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
31
30
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
32
31
  const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
33
32
  const WEBHOOK_PORT = parseInt(process.env.WEBHOOK_PORT || "3001");
@@ -177,7 +176,7 @@ async function main() {
177
176
 
178
177
  try {
179
178
  // Step 4: Connect to Teneo
180
- console.log("⚙️ Step 4: Connecting to Teneo network...");
179
+ console.log("⚙️ Step 4: Connecting to Teneo Protocol...");
181
180
  await sdk.connect();
182
181
  console.log("✅ Connected!\n");
183
182
 
@@ -21,8 +21,7 @@ import type { Request, Response } from "express";
21
21
  import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
22
22
 
23
23
  // Load configuration from environment
24
- const WS_URL =
25
- process.env.WS_URL || "wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws";
24
+ const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
26
25
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
27
26
  const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
28
27
  const PORT = parseInt(process.env.PORT || "3000");
@@ -78,7 +77,7 @@ sdk.on("error", (error) => {
78
77
  });
79
78
 
80
79
  // Connect to Teneo
81
- console.log("🔌 Connecting to Teneo network...");
80
+ console.log("🔌 Connecting to Teneo Protocol...");
82
81
  await sdk.connect();
83
82
  console.log("✅ Connected!\n");
84
83
 
@@ -15,8 +15,7 @@ import "dotenv/config";
15
15
  import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
16
16
 
17
17
  // Load configuration from environment
18
- const WS_URL =
19
- process.env.WS_URL || "wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws";
18
+ const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
20
19
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
21
20
  const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
22
21
 
@@ -336,7 +335,7 @@ async function main() {
336
335
  // ============================================================================
337
336
 
338
337
  try {
339
- console.log("📡 Connecting to Teneo network...\n");
338
+ console.log("📡 Connecting to Teneo Protocol...\n");
340
339
  console.log("=".repeat(80));
341
340
  console.log("Listening to all events... (will run for 30 seconds)");
342
341
  console.log("=".repeat(80) + "\n");
@@ -29,7 +29,7 @@ Create a `.env` file in the project root or export these variables:
29
29
  ```bash
30
30
  # Required
31
31
  PRIVATE_KEY=your_ethereum_private_key_here
32
- WS_URL=wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws
32
+ WS_URL=wss://your-teneo-server.com/ws
33
33
 
34
34
  # Optional
35
35
  DEFAULT_ROOM=general
@@ -103,7 +103,7 @@ async function main() {
103
103
 
104
104
  try {
105
105
  // Connect to Teneo
106
- console.log("[SDK] Connecting to Teneo network...");
106
+ console.log("[SDK] Connecting to Teneo Protocol...");
107
107
  await sdk.connect();
108
108
 
109
109
  // Wait for ready
@@ -64,7 +64,7 @@ async function initSDK() {
64
64
 
65
65
  // Set up event listeners
66
66
  sdk.on("connection:open", () => {
67
- console.log("[SDK] Connected to Teneo network");
67
+ console.log("[SDK] Connected to Teneo Protocol");
68
68
  });
69
69
 
70
70
  sdk.on("auth:success", (state) => {
@@ -137,7 +137,7 @@ wss.on("connection", (ws: WebSocket) => {
137
137
  ws.send(
138
138
  JSON.stringify({
139
139
  type: "error",
140
- message: "Not connected to Teneo network"
140
+ message: "Not connected to Teneo Protocol"
141
141
  })
142
142
  );
143
143
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teneo-protocol/sdk",
3
- "version": "1.0.1",
3
+ "version": "2.2.0",
4
4
  "description": "TypeScript SDK for external platforms to interact with Teneo agents",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -15,13 +15,24 @@
15
15
  ],
16
16
  "author": "Teneo Protocol",
17
17
  "license": "AGPL-3.0",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/TeneoProtocolAI/teneo-sdk.git"
21
+ },
22
+ "bugs": {
23
+ "url": "https://github.com/TeneoProtocolAI/teneo-sdk/issues"
24
+ },
25
+ "homepage": "https://github.com/TeneoProtocolAI/teneo-sdk#readme",
18
26
  "dependencies": {
27
+ "@hono/node-server": "^1.19.6",
19
28
  "eventemitter3": "^5.0.1",
29
+ "hono": "^4.10.4",
20
30
  "node-fetch": "^3.3.2",
21
31
  "pino": "^8.17.2",
22
32
  "uuid": "^9.0.1",
23
33
  "viem": "^2.37.11",
24
34
  "ws": "^8.16.0",
35
+ "x402": "^0.7.3",
25
36
  "zod": "^3.22.4"
26
37
  },
27
38
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
2
  import { WebSocketClient } from "./websocket-client";
3
- import { ConnectionError, AuthenticationError, TimeoutError } from "../types/events";
3
+ import { ConnectionError } from "../types/events";
4
4
  import type { SDKConfig } from "../types/config";
5
5
  import WebSocket from "ws";
6
6
  import { privateKeyToAccount } from "viem/accounts";
@@ -21,10 +21,13 @@ vi.mock("viem/accounts", () => ({
21
21
  describe("WebSocketClient", () => {
22
22
  let client: WebSocketClient;
23
23
  let mockConfig: SDKConfig;
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
25
  let mockWs: any;
26
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
27
  let mockAccount: any;
26
28
 
27
29
  // Helper to simulate successful authentication
30
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
31
  const simulateAuth = (client: any) => {
29
32
  // Update auth state to bypass authentication wait
30
33
  client.updateAuthState({ authenticated: true });
@@ -49,9 +52,11 @@ describe("WebSocketClient", () => {
49
52
  mockWs = {
50
53
  on: vi.fn(),
51
54
  once: vi.fn(),
52
- send: vi.fn((data: any, callback?: any) => callback && callback()),
55
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
56
+ send: vi.fn((data: unknown, callback?: () => void) => callback && callback()),
53
57
  close: vi.fn(),
54
- ping: vi.fn((callback?: any) => callback && callback()),
58
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
+ ping: vi.fn((callback?: () => void) => callback && callback()),
55
60
  terminate: vi.fn(),
56
61
  readyState: WebSocket.OPEN,
57
62
  CONNECTING: 0,
@@ -55,7 +55,11 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
55
55
  private signatureVerifier?: SignatureVerifier;
56
56
  private deduplicationCache?: DeduplicationCache;
57
57
  private reconnectPolicy: RetryPolicy;
58
- private roomManager?: any; // Reference to RoomManager for handler context
58
+ private roomManager?: import("../managers/room-manager").RoomManager; // Reference to RoomManager for handler context
59
+ private roomManagementManager?: import("../managers/room-management-manager").RoomManagementManager; // Reference to RoomManagementManager for handler context (v2.0.0)
60
+ private agentRoomManager?: import("../managers/agent-room-manager").AgentRoomManager; // Reference to AgentRoomManager for handler context (v2.0.0)
61
+ private adminManager?: import("../managers/admin-manager").AdminManager; // Reference to AdminManager for admin handlers
62
+ private agentRegistry?: import("../managers/agent-registry").AgentRegistry; // Reference to AgentRegistry for agent details handler
59
63
  private intentionalDisconnect: boolean = false; // Track intentional disconnect to prevent reconnection
60
64
 
61
65
  private connectionState: ConnectionState = {
@@ -73,6 +77,7 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
73
77
  private pendingMessages = new Map<
74
78
  string,
75
79
  {
80
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
76
81
  resolve: (value: any) => void;
77
82
  reject: (error: Error) => void;
78
83
  timeout: NodeJS.Timeout;
@@ -159,6 +164,7 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
159
164
  // Initialize signature verifier if configured (SEC-2)
160
165
  if (this.config.validateSignatures) {
161
166
  this.signatureVerifier = new SignatureVerifier({
167
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
162
168
  trustedAddresses: this.config.trustedAgentAddresses as any[],
163
169
  requireSignaturesFor: this.config.requireSignaturesFor,
164
170
  strictMode: this.config.strictSignatureValidation
@@ -207,10 +213,46 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
207
213
  * Set the RoomManager instance for handler context
208
214
  * Called by TeneoSDK after initialization
209
215
  */
210
- public setRoomManager(roomManager: any): void {
216
+ public setRoomManager(roomManager: import("../managers/room-manager").RoomManager): void {
211
217
  this.roomManager = roomManager;
212
218
  }
213
219
 
220
+ /**
221
+ * Sets the room management manager for room CRUD operations (v2.0.0)
222
+ * @internal
223
+ */
224
+ public setRoomManagementManager(
225
+ roomManagementManager: import("../managers/room-management-manager").RoomManagementManager
226
+ ): void {
227
+ this.roomManagementManager = roomManagementManager;
228
+ }
229
+
230
+ /**
231
+ * Sets the agent room manager for agent-room operations (v2.0.0)
232
+ * @internal
233
+ */
234
+ public setAgentRoomManager(
235
+ agentRoomManager: import("../managers/agent-room-manager").AgentRoomManager
236
+ ): void {
237
+ this.agentRoomManager = agentRoomManager;
238
+ }
239
+
240
+ /**
241
+ * Sets the admin manager for admin-only features
242
+ * @internal
243
+ */
244
+ public setAdminManager(adminManager: import("../managers/admin-manager").AdminManager): void {
245
+ this.adminManager = adminManager;
246
+ }
247
+
248
+ /**
249
+ * Sets the agent registry for agent details lookups
250
+ * @internal
251
+ */
252
+ public setAgentRegistry(agentRegistry: import("../managers/agent-registry").AgentRegistry): void {
253
+ this.agentRegistry = agentRegistry;
254
+ }
255
+
214
256
  /**
215
257
  * Establishes a WebSocket connection to the Teneo server.
216
258
  * Handles connection timeout, authentication challenge-response flow,
@@ -296,7 +338,11 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
296
338
  if (parseResult.success) {
297
339
  this.handleMessage(parseResult.data as BaseMessage);
298
340
  } else {
299
- this.logger.error("Invalid message format", parseResult.error);
341
+ // Use warn instead of error - allows SDK to be more resilient
342
+ this.logger.warn("Received message with unknown or invalid format", {
343
+ type: rawMessage?.type,
344
+ error: parseResult.error?.message
345
+ });
300
346
  this.emit(
301
347
  "message:error",
302
348
  new ValidationError("Invalid message format", parseResult.error),
@@ -494,7 +540,7 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
494
540
  this.logger.error("Failed to send message", error);
495
541
  reject(error);
496
542
  } else {
497
- this.logger.debug("Message sent", { type: validatedMessage.type });
543
+ this.logger.debug("Message sent", validatedMessage);
498
544
  this.emit("message:sent", validatedMessage);
499
545
  resolve();
500
546
  }
@@ -522,6 +568,7 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
522
568
  * console.log('Response received:', response);
523
569
  * ```
524
570
  */
571
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
525
572
  public async sendMessageWithResponse<T = any>(
526
573
  message: BaseMessage,
527
574
  timeout?: number
@@ -641,6 +688,7 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
641
688
  */
642
689
  private createHandlerContext(): HandlerContext {
643
690
  return {
691
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
644
692
  emit: (event: string, ...args: any[]) => this.emit(event as any, ...args),
645
693
  sendWebhook: async () => {
646
694
  // Webhooks are handled by WebhookHandler in TeneoSDK
@@ -650,9 +698,15 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
650
698
  logger: this.logger,
651
699
  getConnectionState: () => this.getConnectionState(),
652
700
  getAuthState: () => this.getAuthState(),
701
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
653
702
  updateConnectionState: (update: any) => this.updateConnectionState(update),
703
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
654
704
  updateAuthState: (update: any) => this.updateAuthState(update),
655
705
  roomManager: this.roomManager,
706
+ roomManagementManager: this.roomManagementManager,
707
+ agentRoomManager: this.agentRoomManager,
708
+ adminManager: this.adminManager,
709
+ agentRegistry: this.agentRegistry,
656
710
  account: this.account,
657
711
  sendMessage: (message: BaseMessage) => this.sendMessage(message)
658
712
  };
@@ -29,6 +29,7 @@ describe("ResponseFormatter", () => {
29
29
  });
30
30
 
31
31
  it("should validate format option", () => {
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
33
  expect(() => new ResponseFormatter({ format: "invalid" as any })).toThrow();
33
34
  });
34
35
  });
@@ -303,6 +304,7 @@ describe("ResponseFormatter", () => {
303
304
 
304
305
  it("should handle unknown message types", () => {
305
306
  const unknown: BaseMessage = {
307
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
306
308
  type: "unknown" as any,
307
309
  content: "Unknown content",
308
310
  data: { key: "value" }
@@ -296,7 +296,7 @@ export class ResponseFormatter {
296
296
  /**
297
297
  * Format raw message (no transformation)
298
298
  */
299
- private formatRaw(message: BaseMessage): any {
299
+ private formatRaw(message: BaseMessage): BaseMessage {
300
300
  return message;
301
301
  }
302
302
 
@@ -467,7 +467,7 @@ export class ResponseFormatter {
467
467
  /**
468
468
  * Format JSON object for display
469
469
  */
470
- private formatJSON(obj: any, indent = 0): string {
470
+ private formatJSON(obj: unknown, indent = 0): string {
471
471
  if (obj === null || obj === undefined) {
472
472
  return "null";
473
473
  }
@@ -497,7 +497,7 @@ export class ResponseFormatter {
497
497
  /**
498
498
  * Format array for display
499
499
  */
500
- private formatArray(arr: any[], indent = 0): string {
500
+ private formatArray(arr: unknown[], indent = 0): string {
501
501
  if (arr.length === 0) {
502
502
  return "[]";
503
503
  }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Handler for agent_details_response messages
3
+ * Processes detailed agent information from the server
4
+ */
5
+
6
+ import { AgentDetailsResponseMessage, AgentDetailsResponseMessageSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+
10
+ export class AgentDetailsResponseHandler extends BaseMessageHandler<AgentDetailsResponseMessage> {
11
+ readonly type = "agent_details_response" as const;
12
+ readonly schema = AgentDetailsResponseMessageSchema;
13
+
14
+ protected handleValidated(message: AgentDetailsResponseMessage, context: HandlerContext): void {
15
+ if (!message.data?.agent) {
16
+ context.logger.warn("Received agent_details_response without agent data");
17
+ return;
18
+ }
19
+
20
+ const { agent } = message.data;
21
+
22
+ context.logger.debug("Handling agent_details_response", {
23
+ agentId: agent.agent_id,
24
+ agentName: agent.agent_name
25
+ });
26
+
27
+ // Delegate to agent registry if available
28
+ const agentRegistry = context.agentRegistry;
29
+ if (agentRegistry && typeof agentRegistry.handleAgentDetails === "function") {
30
+ agentRegistry.handleAgentDetails(agent);
31
+ }
32
+
33
+ context.logger.info("Agent details received", {
34
+ agentId: agent.agent_id,
35
+ agentName: agent.agent_name,
36
+ status: agent.status
37
+ });
38
+
39
+ // Send webhook
40
+ this.sendWebhook(context, "agent_details_response", { agent });
41
+ }
42
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Handler for agent_room_operation_response messages (v2.0.0)
3
+ * Processes responses from agent-room operations (add, remove)
4
+ */
5
+
6
+ import { AgentRoomOperationResponse, AgentRoomOperationResponseSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+ import { SDKError } from "../../types/events";
10
+ import { ErrorCode } from "../../types/error-codes";
11
+
12
+ export class AgentRoomOperationResponseHandler extends BaseMessageHandler<AgentRoomOperationResponse> {
13
+ readonly type = "agent_room_operation_response" as const;
14
+ readonly schema = AgentRoomOperationResponseSchema;
15
+
16
+ protected handleValidated(message: AgentRoomOperationResponse, context: HandlerContext): void {
17
+ const { success, message: errorMessage, room_id, agent_id } = message.data;
18
+
19
+ context.logger.debug("Handling agent_room_operation_response", {
20
+ success,
21
+ roomId: room_id,
22
+ agentId: agent_id
23
+ });
24
+
25
+ if (!success) {
26
+ // Operation failed - emit error events
27
+ const error = new SDKError(
28
+ errorMessage || "Agent room operation failed",
29
+ ErrorCode.OPERATION_FAILED
30
+ );
31
+
32
+ context.logger.error("Agent room operation failed", {
33
+ roomId: room_id,
34
+ agentId: agent_id,
35
+ error: errorMessage
36
+ });
37
+
38
+ // Emit both add and remove error events - listeners will filter by room/agent ID
39
+ this.emit(context, "agent_room:add_error", error, room_id);
40
+ this.emit(context, "agent_room:remove_error", error, room_id);
41
+
42
+ // Send webhook
43
+ this.sendWebhook(context, "agent_room_operation_error", {
44
+ success: false,
45
+ message: errorMessage,
46
+ room_id,
47
+ agent_id
48
+ });
49
+
50
+ return;
51
+ }
52
+
53
+ // Operation succeeded
54
+ if (room_id && agent_id) {
55
+ context.logger.info("Agent room operation succeeded", {
56
+ roomId: room_id,
57
+ agentId: agent_id
58
+ });
59
+
60
+ // Emit success events
61
+ // The promise handlers in AgentRoomManager will filter by room_id and agent_id
62
+ this.emit(context, "agent_room:agent_added", room_id, agent_id);
63
+ this.emit(context, "agent_room:agent_removed", room_id, agent_id);
64
+
65
+ // Send webhook
66
+ this.sendWebhook(context, "agent_room_operation", {
67
+ success: true,
68
+ room_id,
69
+ agent_id,
70
+ message: "Agent room operation completed successfully"
71
+ });
72
+ } else {
73
+ // Unexpected: success but missing required fields
74
+ context.logger.warn("Agent room operation succeeded but missing room_id or agent_id");
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Handler for agent_status_update messages (v2.0.0)
3
+ * Processes real-time agent status updates for rooms
4
+ */
5
+
6
+ import { AgentStatusUpdateMessage, AgentStatusUpdateMessageSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+
10
+ export class AgentStatusUpdateHandler extends BaseMessageHandler<AgentStatusUpdateMessage> {
11
+ readonly type = "agent_status_update" as const;
12
+ readonly schema = AgentStatusUpdateMessageSchema;
13
+
14
+ protected handleValidated(message: AgentStatusUpdateMessage, context: HandlerContext): void {
15
+ const { room_id, agent_id, status, agent } = message.data;
16
+
17
+ context.logger.debug("Handling agent_status_update", {
18
+ roomId: room_id,
19
+ agentId: agent_id,
20
+ status,
21
+ hasAgent: !!agent
22
+ });
23
+
24
+ // Invalidate cache for this room via agent room manager
25
+ const agentRoomManager = context.agentRoomManager;
26
+ if (agentRoomManager && typeof agentRoomManager.handleStatusUpdate === "function") {
27
+ agentRoomManager.handleStatusUpdate(room_id, agent_id, status);
28
+ }
29
+
30
+ context.logger.info("Agent status updated", {
31
+ roomId: room_id,
32
+ agentId: agent_id,
33
+ status
34
+ });
35
+
36
+ // Emit status update event
37
+ this.emit(context, "agent_room:status_update", {
38
+ roomId: room_id,
39
+ agentId: agent_id,
40
+ status,
41
+ agent
42
+ });
43
+
44
+ // Send webhook
45
+ this.sendWebhook(context, "agent_status_update", {
46
+ room_id,
47
+ agent_id,
48
+ status,
49
+ agent
50
+ });
51
+ }
52
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Handler for all_agents_response messages (Admin only)
3
+ * Processes paginated agent list for admin users
4
+ */
5
+
6
+ import { AllAgentsResponse, AllAgentsResponseSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+
10
+ export class AllAgentsResponseHandler extends BaseMessageHandler<AllAgentsResponse> {
11
+ readonly type = "all_agents_response" as const;
12
+ readonly schema = AllAgentsResponseSchema;
13
+
14
+ protected handleValidated(message: AllAgentsResponse, context: HandlerContext): void {
15
+ const { agents, total, offset, has_more, filter } = message.data;
16
+
17
+ context.logger.debug("Handling all_agents_response", {
18
+ count: agents.length,
19
+ total,
20
+ offset,
21
+ hasMore: has_more
22
+ });
23
+
24
+ // Delegate to admin manager if available
25
+ const adminManager = context.adminManager;
26
+ if (adminManager && typeof adminManager.handleAllAgentsResponse === "function") {
27
+ adminManager.handleAllAgentsResponse(message.data, message.request_id);
28
+ }
29
+
30
+ context.logger.info("All agents response received", {
31
+ count: agents.length,
32
+ total,
33
+ filter
34
+ });
35
+
36
+ // Send webhook
37
+ this.sendWebhook(context, "all_agents_response", message.data);
38
+ }
39
+ }