@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
package/dist/teneo-sdk.js CHANGED
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.TeneoSDK = exports.AgentCommandSchema = exports.SendMessageOptionsSchema = void 0;
9
9
  const eventemitter3_1 = require("eventemitter3");
10
10
  const zod_1 = require("zod");
11
+ const accounts_1 = require("viem/accounts");
11
12
  const types_1 = require("./types");
12
13
  const events_1 = require("./types/events");
13
14
  const error_codes_1 = require("./types/error-codes");
@@ -17,6 +18,7 @@ const response_formatter_1 = require("./formatters/response-formatter");
17
18
  const managers_1 = require("./managers");
18
19
  const logger_1 = require("./utils/logger");
19
20
  const validation_1 = require("./types/validation");
21
+ const secure_private_key_1 = require("./utils/secure-private-key");
20
22
  // Zod schemas for SDK-specific interfaces
21
23
  exports.SendMessageOptionsSchema = zod_1.z.object({
22
24
  room: validation_1.RoomIdSchema.optional(),
@@ -31,6 +33,22 @@ exports.AgentCommandSchema = zod_1.z.object({
31
33
  room: validation_1.RoomIdSchema.optional()
32
34
  });
33
35
  class TeneoSDK extends eventemitter3_1.EventEmitter {
36
+ config;
37
+ logger;
38
+ isDestroyed = false;
39
+ secureKey;
40
+ // Core components
41
+ wsClient;
42
+ webhookHandler;
43
+ responseFormatter;
44
+ // Managers
45
+ connection;
46
+ rooms;
47
+ roomManagement;
48
+ agentRoom;
49
+ agents;
50
+ messages;
51
+ _admin;
34
52
  /**
35
53
  * Creates a new instance of the Teneo Protocol SDK.
36
54
  * Initializes all core components, managers, and validates the provided configuration.
@@ -81,7 +99,6 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
81
99
  */
82
100
  constructor(config) {
83
101
  super();
84
- this.isDestroyed = false;
85
102
  try {
86
103
  // Validate partial config first
87
104
  const partialConfig = types_1.PartialSDKConfigSchema.parse(config);
@@ -91,6 +108,15 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
91
108
  this.config = (0, types_1.validateConfig)(fullConfig);
92
109
  // Initialize logger
93
110
  this.logger = this.config.logger ?? this.createDefaultLogger();
111
+ // Store secure key for payment client
112
+ if (config.privateKey) {
113
+ if (typeof config.privateKey === "object" && "use" in config.privateKey) {
114
+ this.secureKey = config.privateKey;
115
+ }
116
+ else {
117
+ this.secureKey = new secure_private_key_1.SecurePrivateKey(config.privateKey);
118
+ }
119
+ }
94
120
  // Initialize core components
95
121
  this.wsClient = new websocket_client_1.WebSocketClient(this.config);
96
122
  this.webhookHandler = new webhook_handler_1.WebhookHandler(this.config, this.logger);
@@ -101,12 +127,34 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
101
127
  // Initialize managers
102
128
  this.connection = new managers_1.ConnectionManager(this.wsClient, this.logger);
103
129
  this.rooms = new managers_1.RoomManager(this.wsClient, this.logger);
130
+ this.roomManagement = new managers_1.RoomManagementManager(this.wsClient, this.logger);
131
+ this.agentRoom = new managers_1.AgentRoomManager(this.wsClient, this.logger, this.roomManagement);
104
132
  this.wsClient.setRoomManager(this.rooms); // Enable subscription tracking in handlers
133
+ this.wsClient.setRoomManagementManager(this.roomManagement); // Enable room CRUD in handlers (v2.0.0)
134
+ this.wsClient.setAgentRoomManager(this.agentRoom); // Enable agent-room operations in handlers (v2.0.0)
105
135
  this.agents = new managers_1.AgentRegistry(this.logger);
136
+ this.agents.setWebSocketClient(this.wsClient); // Enable getAgentDetails requests
137
+ this._admin = new managers_1.AdminManager(this.wsClient, this.logger);
138
+ this.wsClient.setAdminManager(this._admin); // Enable admin handlers
139
+ this.wsClient.setAgentRegistry(this.agents); // Enable agent details handler
106
140
  this.messages = new managers_1.MessageRouter(this.wsClient, this.webhookHandler, this.responseFormatter, this.logger, {
107
141
  messageTimeout: this.config.messageTimeout,
108
- responseFormat: this.config.responseFormat
142
+ responseFormat: this.config.responseFormat,
143
+ autoApproveQuotes: this.config.autoApproveQuotes,
144
+ maxPricePerRequest: this.config.maxPricePerRequest,
145
+ quoteTimeout: this.config.quoteTimeout,
146
+ wsUrl: this.config.wsUrl,
147
+ paymentNetwork: this.config.paymentNetwork,
148
+ paymentAsset: this.config.paymentAsset
109
149
  });
150
+ // Set up payment client if private key is configured (v2.2.0)
151
+ if (this.config.privateKey) {
152
+ const secureKey = this.config.privateKey instanceof secure_private_key_1.SecurePrivateKey
153
+ ? this.config.privateKey
154
+ : new secure_private_key_1.SecurePrivateKey(this.config.privateKey);
155
+ const walletAddress = this.config.walletAddress || this.deriveWalletAddress(this.config.privateKey);
156
+ this.messages.setPaymentClient(secureKey, walletAddress);
157
+ }
110
158
  // Set up event forwarding
111
159
  this.setupEventForwarding();
112
160
  this.logger.info("TeneoSDK initialized", { wsUrl: this.config.wsUrl });
@@ -119,7 +167,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
119
167
  }
120
168
  }
121
169
  /**
122
- * Establishes a connection to the Teneo network via WebSocket.
170
+ * Establishes a connection to the Teneo Protocol via WebSocket.
123
171
  * Handles authentication automatically and joins any configured auto-join rooms.
124
172
  * Emits 'connection:open', 'auth:success', and 'ready' events on successful connection.
125
173
  *
@@ -132,7 +180,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
132
180
  * ```typescript
133
181
  * const sdk = new TeneoSDK({ wsUrl: 'wss://example.com', privateKey: '0x...' });
134
182
  * await sdk.connect();
135
- * console.log('Connected to Teneo network');
183
+ * console.log('Connected to Teneo Protocol');
136
184
  * ```
137
185
  */
138
186
  async connect() {
@@ -140,7 +188,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
140
188
  throw new events_1.SDKError("SDK has been destroyed", error_codes_1.ErrorCode.SDK_DESTROYED, null, false);
141
189
  }
142
190
  try {
143
- this.logger.info("Connecting to Teneo network");
191
+ this.logger.info("Connecting to Teneo Protocol");
144
192
  await this.connection.connect();
145
193
  // Auto-join rooms if configured
146
194
  if (this.config.autoJoinRooms && this.config.autoJoinRooms.length > 0) {
@@ -148,26 +196,26 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
148
196
  await this.rooms.subscribeToRoom(room);
149
197
  }
150
198
  }
151
- this.logger.info("Successfully connected to Teneo network");
199
+ this.logger.info("Successfully connected to Teneo Protocol");
152
200
  }
153
201
  catch (error) {
154
- this.logger.error("Failed to connect to Teneo network", error);
202
+ this.logger.error("Failed to connect to Teneo Protocol", error);
155
203
  throw error;
156
204
  }
157
205
  }
158
206
  /**
159
- * Disconnects from the Teneo network and cleans up all active connections.
207
+ * Disconnects from the Teneo Protocol and cleans up all active connections.
160
208
  * Clears all timers, pending messages, and stops automatic reconnection attempts.
161
209
  * Emits 'disconnect' event after disconnection is complete.
162
210
  *
163
211
  * @example
164
212
  * ```typescript
165
213
  * sdk.disconnect();
166
- * console.log('Disconnected from Teneo network');
214
+ * console.log('Disconnected from Teneo Protocol');
167
215
  * ```
168
216
  */
169
217
  disconnect() {
170
- this.logger.info("Disconnecting from Teneo network");
218
+ this.logger.info("Disconnecting from Teneo Protocol");
171
219
  this.connection.disconnect();
172
220
  }
173
221
  /**
@@ -230,38 +278,64 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
230
278
  return this.messages.sendDirectCommand(command, waitForResponse);
231
279
  }
232
280
  /**
233
- * Subscribes to a specified room in the Teneo network.
234
- * Agents in the room will be able to see and respond to your messages.
281
+ * Requests a quote for a task from the coordinator.
282
+ * The quote includes agent selection, pricing, and expiration.
283
+ * Does NOT auto-approve - use confirmQuote() to execute.
284
+ */
285
+ async requestQuote(content, room) {
286
+ return this.messages.requestQuote(content, room);
287
+ }
288
+ /**
289
+ * Confirms a pending quote and executes the task with payment.
290
+ * Attaches x402 payment header if payment client is configured.
291
+ */
292
+ async confirmQuote(taskId, options) {
293
+ return this.messages.confirmQuote(taskId, options);
294
+ }
295
+ /**
296
+ * Gets a pending quote by task ID.
297
+ */
298
+ getPendingQuote(taskId) {
299
+ return this.messages.getPendingQuote(taskId);
300
+ }
301
+ /**
302
+ * Subscribes to a public room in the Teneo Protocol.
303
+ * This is only needed for public rooms - private rooms are automatically subscribed.
235
304
  * Emits 'room:subscribed' event when successfully subscribed.
236
305
  *
237
- * @param roomId - The ID of the room to subscribe to
306
+ * @param roomId - The ID of the public room to subscribe to
238
307
  * @returns Promise that resolves when the room has been subscribed
239
308
  * @throws {SDKError} If not connected to the network (ErrorCode.NOT_CONNECTED)
240
309
  * @throws {ValidationError} If roomId is empty or invalid
241
310
  *
242
311
  * @example
243
312
  * ```typescript
244
- * await sdk.subscribeToRoom('general');
245
- * console.log('Subscribed to general room');
313
+ * // Subscribe to a public room
314
+ * await sdk.subscribeToRoom('public-announcements');
315
+ * console.log('Subscribed to public room');
316
+ *
317
+ * // Note: Private rooms don't need subscription - you're always subscribed
246
318
  * ```
247
319
  */
248
320
  async subscribeToRoom(roomId) {
249
321
  return this.rooms.subscribeToRoom(roomId);
250
322
  }
251
323
  /**
252
- * Unsubscribes from a specified room in the Teneo network.
253
- * You will no longer receive messages from agents in this room.
324
+ * Unsubscribes from a public room in the Teneo Protocol.
325
+ * You will no longer receive messages from this public room.
254
326
  * Emits 'room:unsubscribed' event when successfully unsubscribed.
255
327
  *
256
- * @param roomId - The ID of the room to unsubscribe from
328
+ * Note: This only applies to public rooms. Private rooms cannot be unsubscribed from.
329
+ *
330
+ * @param roomId - The ID of the public room to unsubscribe from
257
331
  * @returns Promise that resolves when the room has been unsubscribed
258
332
  * @throws {SDKError} If not connected to the network (ErrorCode.NOT_CONNECTED)
259
333
  * @throws {ValidationError} If roomId is empty or invalid
260
334
  *
261
335
  * @example
262
336
  * ```typescript
263
- * await sdk.unsubscribeFromRoom('general');
264
- * console.log('Unsubscribed from general room');
337
+ * await sdk.unsubscribeFromRoom('public-announcements');
338
+ * console.log('Unsubscribed from public room');
265
339
  * ```
266
340
  */
267
341
  async unsubscribeFromRoom(roomId) {
@@ -304,7 +378,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
304
378
  return this.rooms.getSubscribedRooms();
305
379
  }
306
380
  /**
307
- * Gets a list of all available agents in the Teneo network.
381
+ * Gets a list of all available agents in the Teneo Protocol.
308
382
  * The list is automatically updated when new agents join or leave.
309
383
  * Returns a read-only array to prevent external modification.
310
384
  *
@@ -409,7 +483,80 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
409
483
  return this.agents.findByStatus(status);
410
484
  }
411
485
  /**
412
- * Gets a list of all available rooms in the Teneo network.
486
+ * Fetches detailed information about a specific agent from the server.
487
+ * Makes a request to the server for full agent details including capabilities,
488
+ * commands, pricing, and more.
489
+ *
490
+ * @param agentId - The unique identifier of the agent
491
+ * @returns Promise that resolves with full agent details
492
+ * @throws {SDKError} If not connected or request times out
493
+ * @throws {ValidationError} If agentId is invalid
494
+ *
495
+ * @example
496
+ * ```typescript
497
+ * const details = await sdk.getAgentDetails('weather-agent-001');
498
+ * console.log(`Agent: ${details.agent_name}`);
499
+ * console.log(`Capabilities: ${details.capabilities?.length}`);
500
+ * console.log(`Status: ${details.status}`);
501
+ * ```
502
+ */
503
+ async getAgentDetails(agentId) {
504
+ return this.agents.getAgentDetails(agentId);
505
+ }
506
+ // ============================================================================
507
+ // ADMIN API (Admin-Only Features)
508
+ // ============================================================================
509
+ /**
510
+ * Gets the admin manager for admin-only features.
511
+ * Returns undefined if the current user is not an admin.
512
+ * Use this to access admin APIs like listing all agents, user counts, etc.
513
+ *
514
+ * @returns The AdminManager instance if user is admin, undefined otherwise
515
+ *
516
+ * @example
517
+ * ```typescript
518
+ * if (sdk.admin?.isAdmin) {
519
+ * // List all agents in the network
520
+ * const result = await sdk.admin.listAllAgents({ limit: 20 });
521
+ * console.log(`Found ${result.total} agents`);
522
+ *
523
+ * result.agents.forEach(agent => {
524
+ * console.log(`${agent.agent_name}: verified=${agent.is_verified}, banned=${agent.is_banned}`);
525
+ * });
526
+ *
527
+ * // Get user count
528
+ * const userCount = sdk.admin.getLastUserCount();
529
+ * console.log(`Online users: ${userCount?.count}`);
530
+ *
531
+ * // Listen for user count updates
532
+ * sdk.admin.on('user_count', (data) => {
533
+ * console.log(`User count updated: ${data.count}`);
534
+ * });
535
+ * }
536
+ * ```
537
+ */
538
+ get admin() {
539
+ return this._admin.isAdmin ? this._admin : undefined;
540
+ }
541
+ /**
542
+ * Lists all agents in the network (admin only, convenience method).
543
+ * Returns paginated list of agents with full admin information.
544
+ *
545
+ * @param options - Pagination and filter options
546
+ * @returns Promise that resolves with agents list
547
+ * @throws {SDKError} If not connected or not an admin
548
+ *
549
+ * @example
550
+ * ```typescript
551
+ * const result = await sdk.listAllAgents({ limit: 50, filter: 'weather' });
552
+ * console.log(`Found ${result.total} agents matching 'weather'`);
553
+ * ```
554
+ */
555
+ async listAllAgents(options = {}) {
556
+ return this._admin.listAllAgents(options);
557
+ }
558
+ /**
559
+ * Gets a list of all available rooms in the Teneo Protocol.
413
560
  * Includes rooms you have access to based on your authentication.
414
561
  * Returns a read-only array to prevent external modification.
415
562
  *
@@ -448,6 +595,418 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
448
595
  getRoom(roomId) {
449
596
  return this.rooms.getRoom(roomId);
450
597
  }
598
+ // ============================================================================
599
+ // ROOM MANAGEMENT API (v2.0.0)
600
+ // ============================================================================
601
+ /**
602
+ * Creates a new private or public room.
603
+ * Checks room limit before creating (for private rooms).
604
+ * Emits 'room:created' event on success, 'room:create_error' on failure.
605
+ *
606
+ * @param options - Room creation options
607
+ * @param options.name - Room name (1-100 characters)
608
+ * @param options.description - Optional room description (max 500 characters)
609
+ * @param options.isPublic - Whether room is public (default: false)
610
+ * @returns Promise that resolves with created room info
611
+ * @throws {SDKError} If not connected, over limit, or validation fails
612
+ *
613
+ * @example
614
+ * ```typescript
615
+ * const room = await sdk.createRoom({
616
+ * name: 'My Project Room',
617
+ * description: 'Collaboration space for my project',
618
+ * isPublic: false
619
+ * });
620
+ * console.log(`Created room: ${room.id}`);
621
+ * ```
622
+ */
623
+ async createRoom(options) {
624
+ return this.roomManagement.createRoom(options);
625
+ }
626
+ /**
627
+ * Updates an existing room's name and/or description.
628
+ * User must own the room to update it.
629
+ * Emits 'room:updated' event on success, 'room:update_error' on failure.
630
+ *
631
+ * @param roomId - ID of room to update
632
+ * @param updates - Fields to update
633
+ * @param updates.name - New room name (1-100 characters)
634
+ * @param updates.description - New room description (max 500 characters)
635
+ * @returns Promise that resolves with updated room info
636
+ * @throws {SDKError} If not connected, not owner, or validation fails
637
+ *
638
+ * @example
639
+ * ```typescript
640
+ * const room = await sdk.updateRoom('room-123', {
641
+ * name: 'Updated Room Name',
642
+ * description: 'New description'
643
+ * });
644
+ * ```
645
+ */
646
+ async updateRoom(roomId, updates) {
647
+ return this.roomManagement.updateRoom(roomId, updates);
648
+ }
649
+ /**
650
+ * Deletes a room permanently.
651
+ * User must own the room to delete it.
652
+ * Emits 'room:deleted' event on success, 'room:delete_error' on failure.
653
+ *
654
+ * @param roomId - ID of room to delete
655
+ * @returns Promise that resolves when room is deleted
656
+ * @throws {SDKError} If not connected or not owner
657
+ *
658
+ * @example
659
+ * ```typescript
660
+ * await sdk.deleteRoom('room-123');
661
+ * console.log('Room deleted successfully');
662
+ * ```
663
+ */
664
+ async deleteRoom(roomId) {
665
+ return this.roomManagement.deleteRoom(roomId);
666
+ }
667
+ /**
668
+ * Gets all rooms owned by the current user.
669
+ * Synchronous method that returns cached data from authentication.
670
+ *
671
+ * @returns Array of owned room info
672
+ *
673
+ * @example
674
+ * ```typescript
675
+ * const myRooms = sdk.getOwnedRooms();
676
+ * console.log(`I own ${myRooms.length} rooms`);
677
+ * myRooms.forEach(room => {
678
+ * console.log(`- ${room.name} (${room.id})`);
679
+ * });
680
+ * ```
681
+ */
682
+ getOwnedRooms() {
683
+ return this.roomManagement.getOwnedRooms();
684
+ }
685
+ /**
686
+ * Gets all rooms the user is a member of (but doesn't own).
687
+ * Synchronous method that returns cached data from authentication.
688
+ *
689
+ * @returns Array of shared room info
690
+ *
691
+ * @example
692
+ * ```typescript
693
+ * const sharedRooms = sdk.getSharedRooms();
694
+ * console.log(`I'm a member of ${sharedRooms.length} shared rooms`);
695
+ * ```
696
+ */
697
+ getSharedRooms() {
698
+ return this.roomManagement.getSharedRooms();
699
+ }
700
+ /**
701
+ * Gets all rooms the user has access to (both owned and shared).
702
+ * Convenience method that combines getOwnedRooms() and getSharedRooms().
703
+ * Synchronous method that returns cached data from authentication.
704
+ *
705
+ * @returns Array of all room info (owned + shared)
706
+ *
707
+ * @example
708
+ * ```typescript
709
+ * const allRooms = sdk.getAllRooms();
710
+ * console.log(`I have access to ${allRooms.length} total rooms`);
711
+ *
712
+ * // You can filter by ownership if needed
713
+ * const myRooms = allRooms.filter(r => r.is_owner);
714
+ * const sharedWithMe = allRooms.filter(r => !r.is_owner);
715
+ * ```
716
+ */
717
+ getAllRooms() {
718
+ return this.roomManagement.getAllRooms();
719
+ }
720
+ /**
721
+ * Gets the maximum number of private rooms the user can create.
722
+ * Based on user's subscription/plan.
723
+ *
724
+ * @returns Maximum private room limit
725
+ *
726
+ * @example
727
+ * ```typescript
728
+ * const limit = sdk.getRoomLimit();
729
+ * const current = sdk.getOwnedRoomCount();
730
+ * console.log(`Using ${current}/${limit} room slots`);
731
+ * ```
732
+ */
733
+ getRoomLimit() {
734
+ return this.roomManagement.getRoomLimit();
735
+ }
736
+ /**
737
+ * Gets the current count of owned private rooms.
738
+ *
739
+ * @returns Number of rooms user owns
740
+ *
741
+ * @example
742
+ * ```typescript
743
+ * const count = sdk.getOwnedRoomCount();
744
+ * if (sdk.canCreateRoom()) {
745
+ * console.log(`Can create ${sdk.getRoomLimit() - count} more rooms`);
746
+ * }
747
+ * ```
748
+ */
749
+ getOwnedRoomCount() {
750
+ return this.roomManagement.getOwnedRoomCount();
751
+ }
752
+ /**
753
+ * Checks if user can create another private room.
754
+ * Compares current owned room count against limit.
755
+ *
756
+ * @returns True if under limit, false otherwise
757
+ *
758
+ * @example
759
+ * ```typescript
760
+ * if (sdk.canCreateRoom()) {
761
+ * await sdk.createRoom({ name: 'New Room' });
762
+ * } else {
763
+ * console.log('Room limit reached! Upgrade your plan.');
764
+ * }
765
+ * ```
766
+ */
767
+ canCreateRoom() {
768
+ return this.roomManagement.canCreateRoom();
769
+ }
770
+ // ============================================================================
771
+ // AGENT ROOM MANAGEMENT API (v2.0.0)
772
+ // ============================================================================
773
+ /**
774
+ * Adds an agent to a room. Only room owners can add agents.
775
+ * Emits 'agent_room:agent_added' on success, 'agent_room:add_error' on failure.
776
+ *
777
+ * @param roomId - ID of the room to add the agent to
778
+ * @param agentId - ID of the agent to add
779
+ * @returns Promise that resolves when agent is added
780
+ * @throws {SDKError} If not connected, not owner, or agent already in room
781
+ *
782
+ * @example
783
+ * ```typescript
784
+ * await sdk.addAgentToRoom('room-123', 'weather-agent');
785
+ * console.log('Agent added to room');
786
+ * ```
787
+ */
788
+ async addAgentToRoom(roomId, agentId) {
789
+ return this.agentRoom.addAgentToRoom(roomId, agentId);
790
+ }
791
+ /**
792
+ * Removes an agent from a room. Only room owners can remove agents.
793
+ * Emits 'agent_room:agent_removed' on success, 'agent_room:remove_error' on failure.
794
+ *
795
+ * @param roomId - ID of the room to remove the agent from
796
+ * @param agentId - ID of the agent to remove
797
+ * @returns Promise that resolves when agent is removed
798
+ * @throws {SDKError} If not connected, not owner, or agent not in room
799
+ *
800
+ * @example
801
+ * ```typescript
802
+ * await sdk.removeAgentFromRoom('room-123', 'weather-agent');
803
+ * console.log('Agent removed from room');
804
+ * ```
805
+ */
806
+ async removeAgentFromRoom(roomId, agentId) {
807
+ return this.agentRoom.removeAgentFromRoom(roomId, agentId);
808
+ }
809
+ /**
810
+ * Lists all agents in a room.
811
+ * Results are cached for 5 minutes for performance.
812
+ * Emits 'agent_room:agents_listed' when list is received.
813
+ *
814
+ * @param roomId - ID of the room to list agents for
815
+ * @param useCache - Whether to use cached data if available (default: true)
816
+ * @returns Promise that resolves to array of agents in the room
817
+ * @throws {SDKError} If not connected
818
+ *
819
+ * @example
820
+ * ```typescript
821
+ * const agents = await sdk.listRoomAgents('room-123');
822
+ * console.log(`Room has ${agents.length} agents`);
823
+ * agents.forEach(agent => {
824
+ * console.log(`- ${agent.agent_name} (${agent.status})`);
825
+ * });
826
+ * ```
827
+ */
828
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
829
+ async listRoomAgents(roomId, useCache = true) {
830
+ return this.agentRoom.listRoomAgents(roomId, useCache);
831
+ }
832
+ /**
833
+ * Lists all agents available to be added to a room.
834
+ * Shows agents not currently in the room.
835
+ * Results are cached for 5 minutes for performance.
836
+ * Emits 'agent_room:available_agents_listed' when list is received.
837
+ *
838
+ * @param roomId - ID of the room to check available agents for
839
+ * @param useCache - Whether to use cached data if available (default: true)
840
+ * @returns Promise that resolves to array of available agents
841
+ * @throws {SDKError} If not connected
842
+ *
843
+ * @example
844
+ * ```typescript
845
+ * const available = await sdk.listAvailableAgents('room-123');
846
+ * console.log(`${available.length} agents available to add`);
847
+ * ```
848
+ */
849
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
850
+ async listAvailableAgents(roomId, useCache = true) {
851
+ return this.agentRoom.listAvailableAgents(roomId, useCache);
852
+ }
853
+ /**
854
+ * Gets agents in a room from cache (synchronous).
855
+ * Returns undefined if not cached. Use listRoomAgents() to fetch.
856
+ *
857
+ * @param roomId - ID of the room
858
+ * @returns Array of agents if cached, undefined otherwise
859
+ *
860
+ * @example
861
+ * ```typescript
862
+ * const agents = sdk.getRoomAgents('room-123');
863
+ * if (agents) {
864
+ * console.log(`${agents.length} agents (cached)`);
865
+ * } else {
866
+ * await sdk.listRoomAgents('room-123'); // Fetch from server
867
+ * }
868
+ * ```
869
+ */
870
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
871
+ getRoomAgents(roomId) {
872
+ return this.agentRoom.getRoomAgents(roomId);
873
+ }
874
+ /**
875
+ * Gets available agents for a room from cache (synchronous).
876
+ * Returns undefined if not cached. Use listAvailableAgents() to fetch.
877
+ *
878
+ * @param roomId - ID of the room
879
+ * @returns Array of available agents if cached, undefined otherwise
880
+ *
881
+ * @example
882
+ * ```typescript
883
+ * const available = sdk.getAvailableAgents('room-123');
884
+ * if (available) {
885
+ * console.log(`${available.length} agents available (cached)`);
886
+ * }
887
+ * ```
888
+ */
889
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
890
+ getAvailableAgents(roomId) {
891
+ return this.agentRoom.getAvailableAgents(roomId);
892
+ }
893
+ /**
894
+ * Checks if an agent is in a room (synchronous, from cache).
895
+ * Returns undefined if room data not cached.
896
+ *
897
+ * @param roomId - ID of the room
898
+ * @param agentId - ID of the agent
899
+ * @returns True if agent is in room, false if not, undefined if not cached
900
+ *
901
+ * @example
902
+ * ```typescript
903
+ * const inRoom = sdk.isAgentInRoom('room-123', 'weather-agent');
904
+ * if (inRoom === true) {
905
+ * console.log('Agent is in room');
906
+ * } else if (inRoom === false) {
907
+ * console.log('Agent is not in room');
908
+ * } else {
909
+ * console.log('Room data not cached');
910
+ * }
911
+ * ```
912
+ */
913
+ isAgentInRoom(roomId, agentId) {
914
+ return this.agentRoom.isAgentInRoom(roomId, agentId);
915
+ }
916
+ /**
917
+ * Gets the count of agents in a room (synchronous, from cache).
918
+ * Returns undefined if room data not cached.
919
+ *
920
+ * @param roomId - ID of the room
921
+ * @returns Number of agents in room, or undefined if not cached
922
+ *
923
+ * @example
924
+ * ```typescript
925
+ * const count = sdk.getRoomAgentCount('room-123');
926
+ * if (count !== undefined) {
927
+ * console.log(`Room has ${count} agents`);
928
+ * }
929
+ * ```
930
+ */
931
+ getRoomAgentCount(roomId) {
932
+ return this.agentRoom.getRoomAgentCount(roomId);
933
+ }
934
+ /**
935
+ * Invalidates the agent-room cache for a specific room.
936
+ * Forces the next listRoomAgents() or listAvailableAgents() call to fetch fresh data.
937
+ * Useful after bulk operations or when you know the cache is stale.
938
+ *
939
+ * @param roomId - ID of the room to invalidate cache for
940
+ *
941
+ * @example
942
+ * ```typescript
943
+ * // After adding/removing agents
944
+ * await sdk.addAgentToRoom('room-123', 'agent-456');
945
+ * sdk.invalidateAgentRoomCache('room-123');
946
+ * const freshAgents = await sdk.listRoomAgents('room-123');
947
+ * ```
948
+ */
949
+ invalidateAgentRoomCache(roomId) {
950
+ this.agentRoom.invalidateCache(roomId);
951
+ }
952
+ /**
953
+ * Updates user preferences on the server.
954
+ * Server-side enforcement of max price per request - prevents quotes/payments exceeding the limit.
955
+ *
956
+ * @param preferences - User preferences to update
957
+ * @param preferences.maxPricePerRequest - Max price per request in USDC (e.g., 0.01 = $0.01), or null to remove limit
958
+ * @returns Promise that resolves when preferences are updated
959
+ * @throws {SDKError} If update fails or times out
960
+ *
961
+ * @example
962
+ * ```typescript
963
+ * // Set a spending limit of $0.05 per request
964
+ * await sdk.setUserPreferences({ maxPricePerRequest: 0.05 });
965
+ *
966
+ * // Remove the spending limit
967
+ * await sdk.setUserPreferences({ maxPricePerRequest: null });
968
+ * ```
969
+ */
970
+ async setUserPreferences(preferences) {
971
+ if (this.isDestroyed) {
972
+ throw new events_1.SDKError("SDK has been destroyed", error_codes_1.ErrorCode.SDK_DESTROYED, null, false);
973
+ }
974
+ const message = {
975
+ type: "set_user_preferences",
976
+ data: {
977
+ max_price_per_request: preferences.maxPricePerRequest
978
+ }
979
+ };
980
+ return new Promise((resolve, reject) => {
981
+ const timeout = setTimeout(() => {
982
+ cleanup();
983
+ reject(new events_1.SDKError("Set user preferences request timed out", error_codes_1.ErrorCode.TIMEOUT_ERROR));
984
+ }, 30000);
985
+ const handleResponse = (msg) => {
986
+ if (msg.type === "user_preferences_updated") {
987
+ cleanup();
988
+ if (msg.data?.success) {
989
+ this.emit("preferences:updated", {
990
+ maxPricePerRequest: msg.data.max_price_per_request
991
+ });
992
+ resolve();
993
+ }
994
+ else {
995
+ reject(new events_1.SDKError(msg.data?.message || "Failed to update preferences", error_codes_1.ErrorCode.MESSAGE_ERROR));
996
+ }
997
+ }
998
+ };
999
+ const cleanup = () => {
1000
+ clearTimeout(timeout);
1001
+ this.wsClient.off("message:received", handleResponse);
1002
+ };
1003
+ this.wsClient.on("message:received", handleResponse);
1004
+ this.wsClient.sendMessage(message).catch((error) => {
1005
+ cleanup();
1006
+ reject(error);
1007
+ });
1008
+ });
1009
+ }
451
1010
  /**
452
1011
  * Configures webhook URL and headers for receiving real-time event notifications.
453
1012
  * Webhooks allow you to receive events at your server endpoint via HTTP POST requests.
@@ -534,7 +1093,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
534
1093
  * This is a convenience getter that returns only the connection status.
535
1094
  * For detailed state information, use getConnectionState().
536
1095
  *
537
- * @returns True if connected to the Teneo network, false otherwise
1096
+ * @returns True if connected to the Teneo Protocol, false otherwise
538
1097
  *
539
1098
  * @example
540
1099
  * ```typescript
@@ -554,7 +1113,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
554
1113
  * This is a convenience getter that returns only the authentication status.
555
1114
  * For detailed auth information, use getAuthState().
556
1115
  *
557
- * @returns True if authenticated with the Teneo network, false otherwise
1116
+ * @returns True if authenticated with the Teneo Protocol, false otherwise
558
1117
  *
559
1118
  * @example
560
1119
  * ```typescript
@@ -828,6 +1387,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
828
1387
  this.rooms.destroy();
829
1388
  this.agents.destroy();
830
1389
  this.messages.destroy();
1390
+ this._admin.destroy();
831
1391
  // Destroy other components
832
1392
  this.webhookHandler.destroy();
833
1393
  this.removeAllListeners();
@@ -849,12 +1409,28 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
849
1409
  this.connection.on("auth:success", (state) => {
850
1410
  this.logger.debug("Received auth:success event in SDK", {
851
1411
  authenticated: state?.authenticated,
852
- hasRooms: !!state?.roomObjects
1412
+ hasRooms: !!state?.roomObjects,
1413
+ ownedRooms: state?.privateRoomIds?.length || 0,
1414
+ sharedRooms: state?.sharedRoomIds?.length || 0
853
1415
  });
854
1416
  // Update rooms from auth state
855
1417
  if (state.roomObjects) {
856
1418
  this.rooms.updateRoomsFromAuth(state.roomObjects);
857
1419
  }
1420
+ // Ensure RoomManagementManager is synced with auth state
1421
+ if (state.roomObjects && state.roomObjects.length > 0) {
1422
+ const ownedRooms = state.roomObjects.filter((r) => r.is_owner);
1423
+ const sharedRooms = state.roomObjects.filter((r) => !r.is_owner);
1424
+ this.roomManagement.setOwnedRooms(ownedRooms);
1425
+ this.roomManagement.setSharedRooms(sharedRooms);
1426
+ if (state.maxPrivateRooms) {
1427
+ this.roomManagement.setRoomLimit(state.maxPrivateRooms);
1428
+ }
1429
+ }
1430
+ // Set up payment client for x402 payments
1431
+ if (this.secureKey && state.walletAddress) {
1432
+ this.messages.setPaymentClient(this.secureKey, state.walletAddress);
1433
+ }
858
1434
  this.emit("auth:success", state);
859
1435
  });
860
1436
  this.connection.on("auth:error", (error) => this.emit("auth:error", error));
@@ -866,6 +1442,11 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
866
1442
  // Forward agent events from MessageRouter
867
1443
  this.messages.on("agent:selected", (data) => this.emit("agent:selected", data));
868
1444
  this.messages.on("agent:response", (response) => this.emit("agent:response", response));
1445
+ // Forward quote and payment events from MessageRouter (v2.2.0)
1446
+ this.messages.on("quote:received", (quote) => this.emit("quote:received", quote));
1447
+ this.messages.on("payment:blocked", (data) => this.emit("payment:blocked", data));
1448
+ this.messages.on("payment:attached", (data) => this.emit("payment:attached", data));
1449
+ this.messages.on("payment:error", (error) => this.emit("payment:error", error));
869
1450
  // Forward coordinator events from MessageRouter
870
1451
  this.messages.on("coordinator:processing", (request) => this.emit("coordinator:processing", request));
871
1452
  this.messages.on("coordinator:selected", (agentId, reasoning) => this.emit("coordinator:selected", agentId, reasoning));
@@ -877,6 +1458,121 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
877
1458
  // Forward room events from WebSocketClient (emitted by room subscription handlers)
878
1459
  this.wsClient.on("room:subscribed", (data) => this.emit("room:subscribed", data));
879
1460
  this.wsClient.on("room:unsubscribed", (data) => this.emit("room:unsubscribed", data));
1461
+ // Forward room management events from WebSocketClient (emitted by handlers) (v2.0.0)
1462
+ // These events are emitted by message handlers, so we listen on wsClient
1463
+ // We forward to RoomManagementManager first (for promise resolution), then emit on SDK
1464
+ this.wsClient.on("room:created", (room) => {
1465
+ // Update RoomManagementManager cache
1466
+ this.roomManagement.upsertRoom(room);
1467
+ // Emit on RoomManagementManager for promise resolution (see createRoom method)
1468
+ this.roomManagement.emit("room:created", room);
1469
+ // Emit on SDK for external listeners
1470
+ this.emit("room:created", room);
1471
+ });
1472
+ this.wsClient.on("room:updated", (room) => {
1473
+ // Update RoomManagementManager cache
1474
+ this.roomManagement.upsertRoom(room);
1475
+ // Emit on RoomManagementManager for promise resolution (see updateRoom method)
1476
+ this.roomManagement.emit("room:updated", room);
1477
+ // Emit on SDK for external listeners
1478
+ this.emit("room:updated", room);
1479
+ });
1480
+ this.wsClient.on("room:deleted", (roomId) => {
1481
+ // Remove from RoomManagementManager cache
1482
+ this.roomManagement.removeRoom(roomId);
1483
+ // Emit on RoomManagementManager for promise resolution (see deleteRoom method)
1484
+ this.roomManagement.emit("room:deleted", roomId);
1485
+ // Emit on SDK for external listeners
1486
+ this.emit("room:deleted", roomId);
1487
+ });
1488
+ this.wsClient.on("room:create_error", (error) => {
1489
+ // Emit on RoomManagementManager for promise rejection
1490
+ this.roomManagement.emit("room:create_error", error);
1491
+ // Emit on SDK for external listeners
1492
+ this.emit("room:create_error", error);
1493
+ });
1494
+ this.wsClient.on("room:update_error", (error, roomId) => {
1495
+ // Emit on RoomManagementManager for promise rejection
1496
+ this.roomManagement.emit("room:update_error", error, roomId);
1497
+ // Emit on SDK for external listeners
1498
+ this.emit("room:update_error", error, roomId);
1499
+ });
1500
+ this.wsClient.on("room:delete_error", (error, roomId) => {
1501
+ // Emit on RoomManagementManager for promise rejection
1502
+ this.roomManagement.emit("room:delete_error", error, roomId);
1503
+ // Emit on SDK for external listeners
1504
+ this.emit("room:delete_error", error, roomId);
1505
+ });
1506
+ // Forward agent room management events from WebSocketClient (emitted by handlers) (v2.0.0)
1507
+ // These events are emitted by message handlers, so we listen on wsClient
1508
+ // We forward to AgentRoomManager first (for promise resolution), then emit on SDK
1509
+ this.wsClient.on("agent_room:agent_added", (roomId, agentId) => {
1510
+ // Emit on AgentRoomManager for promise resolution (see addAgentToRoom method)
1511
+ this.agentRoom.emit("agent_room:agent_added", roomId, agentId);
1512
+ // Emit on SDK for external listeners
1513
+ this.emit("agent_room:agent_added", roomId, agentId);
1514
+ });
1515
+ this.wsClient.on("agent_room:agent_removed", (roomId, agentId) => {
1516
+ // Emit on AgentRoomManager for promise resolution (see removeAgentFromRoom method)
1517
+ this.agentRoom.emit("agent_room:agent_removed", roomId, agentId);
1518
+ // Emit on SDK for external listeners
1519
+ this.emit("agent_room:agent_removed", roomId, agentId);
1520
+ });
1521
+ this.wsClient.on("agent_room:agents_listed", (roomId, agents) => {
1522
+ // Emit on AgentRoomManager for promise resolution
1523
+ this.agentRoom.emit("agent_room:agents_listed", roomId, agents);
1524
+ // Emit on SDK for external listeners
1525
+ this.emit("agent_room:agents_listed", roomId, agents);
1526
+ });
1527
+ this.wsClient.on("agent_room:available_agents_listed", (agents) => {
1528
+ // Emit on AgentRoomManager for promise resolution
1529
+ this.agentRoom.emit("agent_room:available_agents_listed", agents);
1530
+ // Emit on SDK for external listeners
1531
+ this.emit("agent_room:available_agents_listed", agents);
1532
+ });
1533
+ this.wsClient.on("agent_room:status_update", (data) => {
1534
+ // Emit on SDK for external listeners
1535
+ this.emit("agent_room:status_update", data);
1536
+ });
1537
+ this.wsClient.on("agent_room:add_error", (error, roomId) => {
1538
+ // Emit on AgentRoomManager for promise rejection
1539
+ this.agentRoom.emit("agent_room:add_error", error, roomId);
1540
+ // Emit on SDK for external listeners
1541
+ this.emit("agent_room:add_error", error, roomId);
1542
+ });
1543
+ this.wsClient.on("agent_room:remove_error", (error, roomId) => {
1544
+ // Emit on AgentRoomManager for promise rejection
1545
+ this.agentRoom.emit("agent_room:remove_error", error, roomId);
1546
+ // Emit on SDK for external listeners
1547
+ this.emit("agent_room:remove_error", error, roomId);
1548
+ });
1549
+ this.wsClient.on("agent_room:list_error", (error, roomId) => {
1550
+ // Emit on AgentRoomManager for promise rejection
1551
+ this.agentRoom.emit("agent_room:list_error", error, roomId);
1552
+ // Emit on SDK for external listeners
1553
+ this.emit("agent_room:list_error", error, roomId);
1554
+ });
1555
+ this.wsClient.on("agent_room:list_available_error", (error) => {
1556
+ // Emit on AgentRoomManager for promise rejection
1557
+ this.agentRoom.emit("agent_room:list_available_error", error);
1558
+ // Emit on SDK for external listeners
1559
+ this.emit("agent_room:list_available_error", error);
1560
+ });
1561
+ // Forward admin events from AdminManager
1562
+ this._admin.on("user_count", (data) => {
1563
+ this.emit("admin:user_count", data);
1564
+ });
1565
+ this._admin.on("status_changed", (isAdmin) => {
1566
+ this.emit("admin:status_changed", isAdmin);
1567
+ });
1568
+ // Forward rate limit notifications from WebSocketClient (emitted by handlers)
1569
+ this.wsClient.on("rate_limit", (notification) => {
1570
+ this.emit("rate_limit", notification);
1571
+ });
1572
+ // Forward user authenticated events from WebSocketClient (emitted by handlers)
1573
+ this.wsClient.on("user:authenticated", (data) => {
1574
+ this.emit("user:authenticated", data);
1575
+ });
880
1576
  // Forward webhook events from WebhookHandler
881
1577
  this.webhookHandler.on("webhook:sent", (payload, url) => this.emit("webhook:sent", payload, url));
882
1578
  this.webhookHandler.on("webhook:success", (response, url) => this.emit("webhook:success", response, url));
@@ -886,8 +1582,12 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
886
1582
  this.connection.on("error", (error) => {
887
1583
  this.emit("error", error);
888
1584
  // Fire and forget - don't block event emission
1585
+ // Defensive check: ensure error has toJSON method (SDKError instances do)
1586
+ const errorPayload = typeof error.toJSON === "function"
1587
+ ? error.toJSON()
1588
+ : { message: error.message, name: error.name, code: error.code };
889
1589
  this.webhookHandler
890
- .sendWebhook("error", error, { code: error.code })
1590
+ .sendWebhook("error", errorPayload, { code: error.code })
891
1591
  .catch((webhookError) => {
892
1592
  this.logger.error("Failed to send webhook for error event", webhookError);
893
1593
  });
@@ -902,6 +1602,15 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
902
1602
  createDefaultLogger() {
903
1603
  return (0, logger_1.createPinoLogger)(this.config.logLevel ?? "info", "TeneoSDK");
904
1604
  }
1605
+ /**
1606
+ * Derive wallet address from private key
1607
+ */
1608
+ deriveWalletAddress(privateKey) {
1609
+ if (privateKey instanceof secure_private_key_1.SecurePrivateKey) {
1610
+ return privateKey.use((key) => (0, accounts_1.privateKeyToAccount)(key).address);
1611
+ }
1612
+ return (0, accounts_1.privateKeyToAccount)(privateKey).address;
1613
+ }
905
1614
  /**
906
1615
  * Creates a new SDK configuration builder for fluent configuration.
907
1616
  * The builder pattern provides a more intuitive way to configure the SDK