@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
@@ -26,8 +26,27 @@ export class AuthMessageHandler extends BaseMessageHandler<AuthMessage> {
26
26
  isCachedAuth ? "Using cached authentication" : "Authentication successful"
27
27
  );
28
28
 
29
- // Extract rooms
30
- const rooms = this.extractRooms(message.data?.rooms);
29
+ // Extract rooms from both 'rooms' (public) and 'private_rooms' (owned private) arrays
30
+ const publicRooms = this.extractRooms(message.data?.rooms);
31
+ const privateRooms = this.extractRooms(message.data?.private_rooms);
32
+
33
+ // Combine all rooms, ensuring correct ownership flags
34
+ // Public rooms from 'rooms' array are NOT owned by the user
35
+ // Private rooms from 'private_rooms' array ARE owned by the user
36
+ const allRooms = [
37
+ ...publicRooms.map((r) => ({
38
+ ...r,
39
+ is_owner: false, // Explicitly set to false - public rooms are not owned
40
+ is_public: r.is_public !== undefined ? r.is_public : true // Ensure is_public is set
41
+ })),
42
+ ...privateRooms.map((r) => ({
43
+ ...r,
44
+ is_owner: true, // Explicitly set to true - private_rooms array means owned
45
+ is_public: r.is_public !== undefined ? r.is_public : false // Ensure is_public is set
46
+ }))
47
+ ];
48
+
49
+ const { privateRoomIds, sharedRoomIds } = this.categorizeRooms(allRooms);
31
50
 
32
51
  // Update connection state
33
52
  this.updateConnectionState(context, { authenticated: true });
@@ -40,14 +59,45 @@ export class AuthMessageHandler extends BaseMessageHandler<AuthMessage> {
40
59
  isWhitelisted: message.data?.is_whitelisted,
41
60
  isAdmin: message.data?.is_admin_whitelisted,
42
61
  nftVerified: message.data?.nft_verified,
43
- rooms: rooms.map((r) => r.id),
44
- roomObjects: rooms,
45
- privateRoomId: message.data?.private_room_id
62
+ rooms: allRooms.map((r) => r.id),
63
+ roomObjects: allRooms,
64
+ privateRoomId: message.data?.private_room_id,
65
+ // v2.0.0: New fields
66
+ privateRoomIds, // Rooms user owns
67
+ sharedRoomIds, // Rooms user is member of
68
+ maxPrivateRooms: message.data?.max_private_rooms // Max rooms user can create
46
69
  });
47
70
 
71
+ // Initialize room management manager with room data (v2.0.0)
72
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
+ const roomMgmt = (context as any).roomManagementManager;
74
+ if (roomMgmt) {
75
+ // Set room limit
76
+ if (message.data?.max_private_rooms) {
77
+ roomMgmt.setRoomLimit(message.data.max_private_rooms);
78
+ }
79
+
80
+ // Categorize and cache rooms
81
+ const ownedRooms = allRooms.filter((r) => r.is_owner === true);
82
+ const sharedRooms = allRooms.filter((r) => r.is_owner === false);
83
+ roomMgmt.setOwnedRooms(ownedRooms);
84
+ roomMgmt.setSharedRooms(sharedRooms);
85
+
86
+ context.logger.debug("Room management initialized from auth message", {
87
+ owned: ownedRooms.length,
88
+ shared: sharedRooms.length,
89
+ limit: message.data?.max_private_rooms
90
+ });
91
+ }
92
+
48
93
  // Get updated auth state
49
94
  const authState = context.getAuthState();
50
95
 
96
+ // Update admin manager with admin status
97
+ if (context.adminManager) {
98
+ context.adminManager.setAdminStatus(message.data?.is_admin_whitelisted ?? false);
99
+ }
100
+
51
101
  // Emit events
52
102
  this.emit(context, "auth:success", authState);
53
103
  this.emit(context, "ready");
@@ -63,4 +113,27 @@ export class AuthMessageHandler extends BaseMessageHandler<AuthMessage> {
63
113
  }
64
114
  return rooms;
65
115
  }
116
+
117
+ /**
118
+ * Categorize rooms into owned vs member rooms based on is_owner flag
119
+ * @param rooms - Array of room info objects
120
+ * @returns Object with privateRoomIds (owned) and sharedRoomIds (member)
121
+ */
122
+ private categorizeRooms(rooms: Room[]): {
123
+ privateRoomIds: string[];
124
+ sharedRoomIds: string[];
125
+ } {
126
+ const privateRoomIds: string[] = [];
127
+ const sharedRoomIds: string[] = [];
128
+
129
+ for (const room of rooms) {
130
+ if (room.is_owner) {
131
+ if (room.id) privateRoomIds.push(room.id);
132
+ } else {
133
+ if (room.id) sharedRoomIds.push(room.id);
134
+ }
135
+ }
136
+
137
+ return { privateRoomIds, sharedRoomIds };
138
+ }
66
139
  }
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { z } from "zod";
7
- import { AuthSuccessMessage, AuthSuccessMessageSchema, Room } from "../../types";
7
+ import { AuthSuccessMessage, AuthSuccessMessageSchema, RoomInfo } from "../../types";
8
8
  import { BaseMessageHandler } from "./base-handler";
9
9
  import { HandlerContext } from "./types";
10
10
 
@@ -18,8 +18,9 @@ export class AuthSuccessHandler extends BaseMessageHandler<AuthSuccessMessage> {
18
18
  ): Promise<void> {
19
19
  context.logger.info("Authentication successful");
20
20
 
21
- // Extract rooms
21
+ // Extract and categorize rooms
22
22
  const rooms = this.extractRooms(message.data.rooms);
23
+ const { privateRoomIds, sharedRoomIds } = this.categorizeRooms(rooms);
23
24
 
24
25
  // Update connection state
25
26
  this.updateConnectionState(context, { authenticated: true });
@@ -32,14 +33,47 @@ export class AuthSuccessHandler extends BaseMessageHandler<AuthSuccessMessage> {
32
33
  isWhitelisted: message.data.is_whitelisted,
33
34
  isAdmin: message.data.is_admin_whitelisted,
34
35
  nftVerified: message.data.nft_verified,
35
- rooms: rooms.map((r) => r.id),
36
- roomObjects: rooms,
37
- privateRoomId: message.data.private_room_id
36
+
37
+ // Backward compatibility: deprecated fields
38
+ rooms: rooms.map((r) => r.id), // All room IDs
39
+ privateRoomId: message.data.private_room_id, // DEPRECATED: single private room ID
40
+
41
+ // v2.0.0: New fields
42
+ roomObjects: rooms, // Full room objects with is_owner field
43
+ privateRoomIds, // Rooms user owns
44
+ sharedRoomIds, // Rooms user is member of
45
+ maxPrivateRooms: message.data.max_private_rooms // Max rooms user can create
38
46
  });
39
47
 
40
48
  // Get updated auth state
41
49
  const authState = context.getAuthState();
42
50
 
51
+ // Update admin manager with admin status
52
+ if (context.adminManager) {
53
+ context.adminManager.setAdminStatus(message.data.is_admin_whitelisted ?? false);
54
+ }
55
+
56
+ // Initialize room management manager with room data (v2.0.0)
57
+ const roomMgmt = context.roomManagementManager;
58
+ if (roomMgmt) {
59
+ // Set room limit
60
+ if (message.data.max_private_rooms) {
61
+ roomMgmt.setRoomLimit(message.data.max_private_rooms);
62
+ }
63
+
64
+ // Categorize and cache rooms
65
+ const ownedRooms = rooms.filter((r) => r.is_owner);
66
+ const sharedRooms = rooms.filter((r) => !r.is_owner);
67
+ roomMgmt.setOwnedRooms(ownedRooms);
68
+ roomMgmt.setSharedRooms(sharedRooms);
69
+
70
+ context.logger.debug("Room management initialized", {
71
+ owned: ownedRooms.length,
72
+ shared: sharedRooms.length,
73
+ limit: message.data.max_private_rooms
74
+ });
75
+ }
76
+
43
77
  // Emit events
44
78
  this.emit(context, "auth:success", authState);
45
79
  this.emit(context, "ready");
@@ -48,10 +82,33 @@ export class AuthSuccessHandler extends BaseMessageHandler<AuthSuccessMessage> {
48
82
  /**
49
83
  * Extract and normalize rooms from auth data
50
84
  */
51
- private extractRooms(rooms?: Room[]): Room[] {
85
+ private extractRooms(rooms?: RoomInfo[] | null): RoomInfo[] {
52
86
  if (!rooms || !Array.isArray(rooms)) {
53
87
  return [];
54
88
  }
55
89
  return rooms;
56
90
  }
91
+
92
+ /**
93
+ * Categorize rooms into owned vs member rooms based on is_owner flag
94
+ * @param rooms - Array of room info objects
95
+ * @returns Object with privateRoomIds (owned) and sharedRoomIds (member)
96
+ */
97
+ private categorizeRooms(rooms: RoomInfo[]): {
98
+ privateRoomIds: string[];
99
+ sharedRoomIds: string[];
100
+ } {
101
+ const privateRoomIds: string[] = [];
102
+ const sharedRoomIds: string[] = [];
103
+
104
+ for (const room of rooms) {
105
+ if (room.is_owner) {
106
+ privateRoomIds.push(room.id);
107
+ } else {
108
+ sharedRoomIds.push(room.id);
109
+ }
110
+ }
111
+
112
+ return { privateRoomIds, sharedRoomIds };
113
+ }
57
114
  }
@@ -71,31 +71,44 @@ export abstract class BaseMessageHandler<T extends BaseMessage = BaseMessage>
71
71
  /**
72
72
  * Helper: emit event
73
73
  */
74
- protected emit(context: HandlerContext, event: string, ...args: any[]): void {
74
+ protected emit(context: HandlerContext, event: string, ...args: unknown[]): void {
75
75
  context.emit(event, ...args);
76
76
  }
77
77
 
78
78
  /**
79
79
  * Helper: send webhook (fire-and-forget pattern)
80
80
  */
81
- protected sendWebhook(context: HandlerContext, type: string, data: any, metadata?: any): void {
81
+ protected sendWebhook(
82
+ context: HandlerContext,
83
+ type: string,
84
+ data: Record<string, unknown>,
85
+ metadata?: Record<string, unknown>
86
+ ): void {
82
87
  // Fire and forget - don't block event emission
83
- context.sendWebhook(type as any, data, metadata).catch((error) => {
84
- context.logger.error(`Failed to send webhook for ${this.type}`, error);
85
- });
88
+ context
89
+ .sendWebhook(type as Parameters<typeof context.sendWebhook>[0], data, metadata)
90
+ .catch((error) => {
91
+ context.logger.error(`Failed to send webhook for ${this.type}`, error);
92
+ });
86
93
  }
87
94
 
88
95
  /**
89
96
  * Helper: update connection state
90
97
  */
91
- protected updateConnectionState(context: HandlerContext, update: any): void {
98
+ protected updateConnectionState(
99
+ context: HandlerContext,
100
+ update: Partial<import("./types").ConnectionState>
101
+ ): void {
92
102
  context.updateConnectionState(update);
93
103
  }
94
104
 
95
105
  /**
96
106
  * Helper: update auth state
97
107
  */
98
- protected updateAuthState(context: HandlerContext, update: any): void {
108
+ protected updateAuthState(
109
+ context: HandlerContext,
110
+ update: Partial<import("./types").AuthState>
111
+ ): void {
99
112
  context.updateAuthState(update);
100
113
  }
101
114
  }
@@ -9,6 +9,7 @@ export * from "./base-handler";
9
9
 
10
10
  // Export all handlers
11
11
  export { TaskResponseHandler } from "./task-response-handler";
12
+ export { TaskQuoteHandler } from "./task-quote-handler";
12
13
  export { AgentSelectedHandler } from "./agent-selected-handler";
13
14
  export { ChallengeHandler } from "./challenge-handler";
14
15
  export { AuthMessageHandler } from "./auth-message-handler";
@@ -22,9 +23,28 @@ export { PingHandler, PongHandler } from "./ping-pong-handler";
22
23
  export { SubscribeResponseHandler } from "./subscribe-response-handler";
23
24
  export { UnsubscribeResponseHandler } from "./unsubscribe-response-handler";
24
25
  export { ListRoomsResponseHandler } from "./list-rooms-response-handler";
26
+ export { RoomOperationResponseHandler } from "./room-operation-response-handler";
27
+ export { AgentRoomOperationResponseHandler } from "./agent-room-operation-response-handler";
28
+ export { ListRoomAgentsHandler } from "./list-room-agents-handler";
29
+ export { ListAvailableAgentsHandler } from "./list-available-agents-handler";
30
+ export { AgentStatusUpdateHandler } from "./agent-status-update-handler";
31
+
32
+ // Agent Details handler
33
+ export { AgentDetailsResponseHandler } from "./agent-details-response-handler";
34
+
35
+ // Rate Limit handler
36
+ export { RateLimitNotificationHandler } from "./rate-limit-notification-handler";
37
+
38
+ // Admin handlers
39
+ export { AllAgentsResponseHandler } from "./all-agents-response-handler";
40
+ export { UserCountHandler } from "./user-count-handler";
41
+
42
+ // Presence handler
43
+ export { UserAuthenticatedHandler } from "./user-authenticated-handler";
25
44
 
26
45
  // Import for convenience function
27
46
  import { TaskResponseHandler } from "./task-response-handler";
47
+ import { TaskQuoteHandler } from "./task-quote-handler";
28
48
  import { AgentSelectedHandler } from "./agent-selected-handler";
29
49
  import { ChallengeHandler } from "./challenge-handler";
30
50
  import { AuthMessageHandler } from "./auth-message-handler";
@@ -38,6 +58,16 @@ import { PingHandler, PongHandler } from "./ping-pong-handler";
38
58
  import { SubscribeResponseHandler } from "./subscribe-response-handler";
39
59
  import { UnsubscribeResponseHandler } from "./unsubscribe-response-handler";
40
60
  import { ListRoomsResponseHandler } from "./list-rooms-response-handler";
61
+ import { RoomOperationResponseHandler } from "./room-operation-response-handler";
62
+ import { AgentRoomOperationResponseHandler } from "./agent-room-operation-response-handler";
63
+ import { ListRoomAgentsHandler } from "./list-room-agents-handler";
64
+ import { ListAvailableAgentsHandler } from "./list-available-agents-handler";
65
+ import { AgentStatusUpdateHandler } from "./agent-status-update-handler";
66
+ import { AgentDetailsResponseHandler } from "./agent-details-response-handler";
67
+ import { RateLimitNotificationHandler } from "./rate-limit-notification-handler";
68
+ import { AllAgentsResponseHandler } from "./all-agents-response-handler";
69
+ import { UserCountHandler } from "./user-count-handler";
70
+ import { UserAuthenticatedHandler } from "./user-authenticated-handler";
41
71
  import { MessageHandler } from "./types";
42
72
 
43
73
  /**
@@ -58,6 +88,7 @@ export function getDefaultHandlers(
58
88
 
59
89
  // Agent/coordinator handlers
60
90
  new TaskResponseHandler(),
91
+ new TaskQuoteHandler(),
61
92
  new AgentSelectedHandler(),
62
93
  new AgentsListHandler(),
63
94
 
@@ -70,6 +101,28 @@ export function getDefaultHandlers(
70
101
  new UnsubscribeResponseHandler(),
71
102
  new ListRoomsResponseHandler(),
72
103
 
104
+ // Room Management handlers (v2.0.0)
105
+ new RoomOperationResponseHandler(),
106
+
107
+ // Agent Room Management handlers (v2.0.0)
108
+ new AgentRoomOperationResponseHandler(),
109
+ new ListRoomAgentsHandler(),
110
+ new ListAvailableAgentsHandler(),
111
+ new AgentStatusUpdateHandler(),
112
+
113
+ // Agent Details handler
114
+ new AgentDetailsResponseHandler(),
115
+
116
+ // Rate Limit handler
117
+ new RateLimitNotificationHandler(),
118
+
119
+ // Admin handlers
120
+ new AllAgentsResponseHandler(),
121
+ new UserCountHandler(),
122
+
123
+ // Presence handler
124
+ new UserAuthenticatedHandler(),
125
+
73
126
  // Keepalive handlers
74
127
  new PingHandler(),
75
128
  new PongHandler()
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Handler for available_agents_response messages (v2.0.0)
3
+ * Processes responses from list_available_agents requests
4
+ */
5
+
6
+ import { AvailableAgentsResponse, AvailableAgentsResponseSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+ import { AgentRoomInfo } from "../../managers/agent-room-manager";
10
+
11
+ export class ListAvailableAgentsHandler extends BaseMessageHandler<AvailableAgentsResponse> {
12
+ readonly type = "available_agents_response" as const;
13
+ readonly schema = AvailableAgentsResponseSchema;
14
+
15
+ protected handleValidated(message: AvailableAgentsResponse, context: HandlerContext): void {
16
+ const { agents } = message.data;
17
+
18
+ context.logger.debug("Handling available_agents_response", {
19
+ agentCount: agents?.length || 0
20
+ });
21
+
22
+ // Parse agents array (handle undefined as empty array)
23
+ const agentList: AgentRoomInfo[] = agents || [];
24
+
25
+ context.logger.info("Available agents listed", {
26
+ count: agentList.length
27
+ });
28
+
29
+ // Note: We don't cache this globally since it's room-specific
30
+ // The AgentRoomManager will cache it with the room context
31
+
32
+ // Emit success event
33
+ this.emit(context, "agent_room:available_agents_listed", agentList);
34
+
35
+ // Send webhook
36
+ this.sendWebhook(context, "available_agents_listed", {
37
+ agents: agentList,
38
+ count: agentList.length
39
+ });
40
+ }
41
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Handler for room_agents_response messages (v2.0.0)
3
+ * Processes responses from list_room_agents requests
4
+ */
5
+
6
+ import { RoomAgentsResponse, RoomAgentsResponseSchema } 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
+ import { AgentRoomInfo } from "../../managers/agent-room-manager";
12
+
13
+ export class ListRoomAgentsHandler extends BaseMessageHandler<RoomAgentsResponse> {
14
+ readonly type = "room_agents_response" as const;
15
+ readonly schema = RoomAgentsResponseSchema;
16
+
17
+ protected handleValidated(message: RoomAgentsResponse, context: HandlerContext): void {
18
+ const { room_id, agents } = message.data;
19
+
20
+ context.logger.debug("Handling room_agents_response", {
21
+ roomId: room_id,
22
+ agentCount: agents?.length || 0
23
+ });
24
+
25
+ if (!room_id) {
26
+ const error = new SDKError(
27
+ "Room agents response missing room_id",
28
+ ErrorCode.VALIDATION_ERROR
29
+ );
30
+ this.emit(context, "agent_room:list_error", error, undefined);
31
+ return;
32
+ }
33
+
34
+ // Parse agents array (handle undefined as empty array)
35
+ const agentList: AgentRoomInfo[] = agents || [];
36
+
37
+ context.logger.info("Room agents listed", {
38
+ roomId: room_id,
39
+ count: agentList.length
40
+ });
41
+
42
+ // Cache via agent room manager if available
43
+ const agentRoomManager = context.agentRoomManager;
44
+ if (agentRoomManager && typeof agentRoomManager.cacheRoomAgents === "function") {
45
+ agentRoomManager.cacheRoomAgents(room_id, agentList);
46
+ }
47
+
48
+ // Emit success event
49
+ this.emit(context, "agent_room:agents_listed", room_id, agentList);
50
+
51
+ // Send webhook
52
+ this.sendWebhook(context, "room_agents_listed", {
53
+ room_id,
54
+ agents: agentList,
55
+ count: agentList.length
56
+ });
57
+ }
58
+ }
@@ -3,16 +3,18 @@
3
3
  * Processes room list from server
4
4
  */
5
5
 
6
+ import { z } from "zod";
6
7
  import { ListRoomsResponse, ListRoomsResponseSchema } from "../../types";
7
8
  import { BaseMessageHandler } from "./base-handler";
8
9
  import { HandlerContext } from "./types";
9
10
 
10
11
  export class ListRoomsResponseHandler extends BaseMessageHandler<ListRoomsResponse> {
11
12
  readonly type = "list_rooms" as const;
12
- readonly schema = ListRoomsResponseSchema;
13
+ // Cast needed due to Zod transform creating input/output type mismatch
14
+ readonly schema = ListRoomsResponseSchema as z.ZodType<ListRoomsResponse>;
13
15
 
14
16
  protected handleValidated(message: ListRoomsResponse, context: HandlerContext): void {
15
- context.logger.debug("Handling list_rooms response", {
17
+ context.logger.debug("Handling list_rooms", {
16
18
  roomCount: message.data.rooms.length
17
19
  });
18
20
 
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Handler for rate_limit_notification messages
3
+ * Processes rate limit notifications from the server
4
+ */
5
+
6
+ import { RateLimitNotificationMessage, RateLimitNotificationMessageSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+
10
+ export class RateLimitNotificationHandler extends BaseMessageHandler<RateLimitNotificationMessage> {
11
+ readonly type = "rate_limit_notification" as const;
12
+ readonly schema = RateLimitNotificationMessageSchema;
13
+
14
+ protected handleValidated(message: RateLimitNotificationMessage, context: HandlerContext): void {
15
+ const {
16
+ title,
17
+ message: msg,
18
+ cta_text,
19
+ cta_link,
20
+ message_type,
21
+ limit_type,
22
+ reset_at
23
+ } = message.data;
24
+
25
+ context.logger.warn("Rate limit notification received", {
26
+ title,
27
+ limitType: limit_type,
28
+ resetAt: reset_at
29
+ });
30
+
31
+ // Emit rate limit event with camelCase conversion
32
+ this.emit(context, "rate_limit", {
33
+ title,
34
+ message: msg,
35
+ ctaText: cta_text,
36
+ ctaLink: cta_link,
37
+ messageType: message_type,
38
+ limitType: limit_type,
39
+ resetAt: reset_at
40
+ });
41
+
42
+ // Send webhook
43
+ this.sendWebhook(context, "rate_limit_notification", message.data);
44
+ }
45
+ }
@@ -3,7 +3,7 @@
3
3
  * Processes messages from agents (when they send 'message' instead of 'task_response')
4
4
  */
5
5
 
6
- import { UserMessage, UserMessageSchema } from "../../types";
6
+ import { UserMessage, UserMessageSchema, TaskResponseMessage } from "../../types";
7
7
  import { AgentResponse } from "../../types/events";
8
8
  import { BaseMessageHandler } from "./base-handler";
9
9
  import { HandlerContext } from "./types";
@@ -54,7 +54,8 @@ export class RegularMessageHandler extends BaseMessageHandler<UserMessage> {
54
54
  contentType: message.content_type || "text/plain",
55
55
  success: true,
56
56
  timestamp: new Date(),
57
- raw: message as any, // Include raw message for request correlation
57
+ // Cast to TaskResponseMessage for request correlation (message format is compatible)
58
+ raw: message as unknown as TaskResponseMessage,
58
59
  humanized:
59
60
  typeof message.content === "string" ? message.content : JSON.stringify(message.content)
60
61
  };
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Handler for room_operation_response messages (v2.0.0)
3
+ * Processes responses from room CRUD operations (create, update, delete)
4
+ */
5
+
6
+ import { RoomOperationResponse, RoomOperationResponseSchema } 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 RoomOperationResponseHandler extends BaseMessageHandler<RoomOperationResponse> {
13
+ readonly type = "room_operation_response" as const;
14
+ readonly schema = RoomOperationResponseSchema;
15
+
16
+ protected handleValidated(message: RoomOperationResponse, context: HandlerContext): void {
17
+ const { success, message: errorMessage, room_id, room } = message.data;
18
+
19
+ context.logger.debug("Handling room_operation_response", {
20
+ success,
21
+ roomId: room_id,
22
+ hasRoom: !!room
23
+ });
24
+
25
+ if (!success) {
26
+ // Operation failed - emit error event
27
+ const error = new SDKError(
28
+ errorMessage || "Room operation failed",
29
+ ErrorCode.OPERATION_FAILED
30
+ );
31
+
32
+ // Try to determine operation type from message
33
+ // Note: Server should ideally send operation type in response
34
+ // For now we emit generic errors and specific listeners will catch relevant ones
35
+ this.emit(context, "room:create_error", error);
36
+ this.emit(context, "room:update_error", error, room_id);
37
+ this.emit(context, "room:delete_error", error, room_id);
38
+
39
+ // Send webhook
40
+ this.sendWebhook(context, "room_operation_error", {
41
+ success: false,
42
+ message: errorMessage,
43
+ room_id
44
+ });
45
+
46
+ return;
47
+ }
48
+
49
+ // Operation succeeded
50
+ if (room) {
51
+ // Create or Update operation (includes room object)
52
+ context.logger.info("Room operation succeeded", {
53
+ roomId: room.id,
54
+ roomName: room.name
55
+ });
56
+
57
+ // Determine if this was create or update based on whether we have the room cached
58
+ // Note: Ideally server would send operation type in response
59
+ // For now, handlers will emit both and listeners filter by room_id
60
+
61
+ // Update cache via room management manager if available
62
+ const roomManager = context.roomManagementManager;
63
+ if (roomManager && typeof roomManager.upsertRoom === "function") {
64
+ roomManager.upsertRoom(room);
65
+ }
66
+
67
+ // Emit success events
68
+ // The promise handlers in RoomManagementManager will filter by room_id
69
+ this.emit(context, "room:created", room);
70
+ this.emit(context, "room:updated", room);
71
+
72
+ // Send webhook
73
+ this.sendWebhook(context, "room_operation", {
74
+ success: true,
75
+ room,
76
+ message: "Room operation completed successfully"
77
+ });
78
+ } else if (room_id) {
79
+ // Delete operation (only has room_id, no room object)
80
+ context.logger.info("Room deleted", { roomId: room_id });
81
+
82
+ // Remove from cache
83
+ const roomManager = context.roomManagementManager;
84
+ if (roomManager && typeof roomManager.removeRoom === "function") {
85
+ roomManager.removeRoom(room_id);
86
+ }
87
+
88
+ // Emit delete success
89
+ this.emit(context, "room:deleted", room_id);
90
+
91
+ // Send webhook
92
+ this.sendWebhook(context, "room_deleted", {
93
+ success: true,
94
+ room_id,
95
+ message: "Room deleted successfully"
96
+ });
97
+ } else {
98
+ // Unexpected: success but no room or room_id
99
+ context.logger.warn("Room operation succeeded but no room data provided");
100
+ }
101
+ }
102
+ }
@@ -3,7 +3,8 @@
3
3
  * Processes room subscription confirmations
4
4
  */
5
5
 
6
- import { SubscribeResponse, SubscribeResponseSchema } from "../../types";
6
+ import { SubscribeResponse, SubscribeResponseSchema, ErrorCode } from "../../types";
7
+ import { SDKError } from "../../types/events";
7
8
  import { BaseMessageHandler } from "./base-handler";
8
9
  import { HandlerContext } from "./types";
9
10
 
@@ -41,7 +42,16 @@ export class SubscribeResponseHandler extends BaseMessageHandler<SubscribeRespon
41
42
  });
42
43
 
43
44
  // Emit error event
44
- this.emit(context, "error", new Error(`Subscription failed: ${message.data.message}`));
45
+ this.emit(
46
+ context,
47
+ "error",
48
+ new SDKError(
49
+ `Subscription failed: ${message.data.message}`,
50
+ ErrorCode.OPERATION_FAILED,
51
+ { roomId: message.data.room_id },
52
+ true
53
+ )
54
+ );
45
55
  }
46
56
  }
47
57
  }