@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/README.md CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  **Connect your app to the Teneo AI Agent Network**
4
4
 
5
- [![npm version](https://img.shields.io/badge/version-1.0.0-blue)](https://www.npmjs.com/package/@teneo-protocol/sdk)
5
+ [![npm version](https://img.shields.io/badge/version-2.2.0-blue)](https://www.npmjs.com/package/@teneo-protocol/sdk)
6
6
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue)](https://www.typescriptlang.org/)
7
7
  [![Node.js](https://img.shields.io/badge/Node.js-%3E%3D18-green)](https://nodejs.org/)
8
- [![Tests](https://img.shields.io/badge/tests-488%20passing-success)](/)
8
+ [![Tests](https://img.shields.io/badge/tests-671%20passing-success)](/)
9
9
 
10
10
  The Teneo Protocol SDK lets you connect your application to a **decentralized network of specialized AI agents**. Instead of calling a single AI model, your app taps into an entire ecosystem where:
11
11
 
@@ -30,7 +30,7 @@ import { TeneoSDK } from "@teneo-protocol/sdk";
30
30
 
31
31
  // 1. Initialize with your Ethereum private key
32
32
  const sdk = new TeneoSDK({
33
- wsUrl: "wss://developer.chatroom.teneo-protocol.ai/ws",
33
+ wsUrl: "wss://backend.developer.chatroom.teneo-protocol.ai/ws",
34
34
  privateKey: "your_private_key_here" // No 0x prefix
35
35
  });
36
36
 
@@ -47,12 +47,57 @@ await sdk.sendMessage("Give me the last 5 tweets from @elonmusk");
47
47
  ```
48
48
 
49
49
  **That's it!** The coordinator automatically:
50
+
50
51
  1. Routes your message to the right agent
51
52
  2. Gets the response
52
53
  3. Delivers it via the event you're listening to
53
54
 
54
55
  ---
55
56
 
57
+ ## ✨ What's New in v2.2
58
+
59
+ Version 2.2 introduces the **Quote-Approve Payment Flow** with x402 protocol support:
60
+
61
+ ### 💰 Payment Flow (Quote-Approve)
62
+
63
+ - **Automatic payment handling** - SDK handles the full quote → confirm → pay cycle
64
+ - **x402 Protocol** - Industry-standard payment headers (Coinbase x402)
65
+ - **USDC on PEAQ** - Payments settle on PEAQ network (Chain ID 3338)
66
+ - **Price limits** - Set maximum price per request for safety
67
+
68
+ [Jump to Payment Flow API](#-payment-flow-api)
69
+
70
+ ---
71
+
72
+ ## ✨ What's New in v2.0
73
+
74
+ Version 2.0 introduces powerful **room management** and **agent customization** capabilities:
75
+
76
+ ### 🏠 Multi-Room Management
77
+
78
+ - **Create multiple rooms** for different contexts (crypto, gaming, research, etc.)
79
+ - **Update and delete** your owned rooms
80
+ - **Track room limits** based on your subscription tier
81
+ - **Invite members** to your rooms (coming soon)
82
+
83
+ ### 🤖 Agent Room Management
84
+
85
+ - **Customize which agents** are available in each room
86
+ - **Add/remove agents** from your owned rooms
87
+ - **List room agents** with caching for performance
88
+ - **Real-time agent status updates** for room availability
89
+
90
+ ### 📊 Enhanced APIs
91
+
92
+ - 8 new room management methods
93
+ - 8 new agent-room management methods
94
+ - 14 new events for room and agent operations
95
+ - Intelligent caching with 5-minute TTL
96
+
97
+ [Jump to Room Management API](#-room-management-api) | [Jump to Agent Room Management API](#-agent-room-management-api)
98
+
99
+ ---
100
+
56
101
  ## How It Works
57
102
 
58
103
  ### 1. Agent Network Architecture
@@ -88,6 +133,7 @@ Unlike traditional APIs with API keys, Teneo uses **Ethereum wallet signatures**
88
133
  ```
89
134
 
90
135
  This enables:
136
+
91
137
  - 🔐 **No API keys to manage** - Your wallet IS your identity
92
138
 
93
139
  ---
@@ -104,23 +150,35 @@ pnpm run build
104
150
 
105
151
  # Set credentials
106
152
  export PRIVATE_KEY=your_private_key
107
- export TENEO_WS_URL=wss://developer.chatroom.teneo-protocol.ai/ws
153
+ export TENEO_WS_URL=wss://backend.developer.chatroom.teneo-protocol.ai/ws
108
154
  ```
109
155
 
110
- ### Basic Usage Example
156
+ ### Production Dashboard Example
157
+
158
+ The **Production Dashboard** is a comprehensive example showcasing **ALL SDK features** in a real-world web application:
111
159
 
112
160
  ```bash
113
- npx ts-node examples/basic-usage.ts
161
+ pnpm example:dashboard
162
+ # or
163
+ cd examples/production-dashboard && bun run server.ts
114
164
  ```
115
165
 
116
- Demonstrates:
117
- - ✅ Connection and authentication
118
- - Agent discovery
119
- - ✅ Room management
120
- - ✅ Sending messages
121
- - ✅ Event listeners
122
- - ✅ Secure private key handling
166
+ Then open: **[http://localhost:3000](http://localhost:3000)**
167
+
168
+ **What it demonstrates:**
123
169
 
170
+ - ✅ **Full WebSocket Integration** - Connection, authentication, auto-reconnection
171
+ - ✅ **Room Management (v2.0)** - Create, update, delete rooms with ownership tracking
172
+ - ✅ **Agent-Room Management (v2.0)** - Add/remove agents, list room agents with caching
173
+ - ✅ **Message Sending** - Coordinator-based and direct agent commands
174
+ - ✅ **Real-time Updates** - Server-Sent Events (SSE) for live dashboard
175
+ - ✅ **Agent Discovery** - List agents with capabilities and status
176
+ - ✅ **Secure Private Key Handling** - AES-256-GCM encryption in memory
177
+ - ✅ **Webhook Integration** - Real-time event streaming with circuit breaker
178
+ - ✅ **Health Monitoring** - `/health` and `/metrics` endpoints
179
+ - ✅ **Complete Event System** - All SDK events with real-time UI updates
180
+
181
+ Built with **Hono** (fast web framework) and **Bun** (fast JavaScript runtime). See `examples/production-dashboard/README.md` for details.
124
182
 
125
183
  ---
126
184
 
@@ -139,14 +197,11 @@ const sdk = new TeneoSDK({
139
197
  await sdk.connect();
140
198
 
141
199
  // Wait for response (blocks until agent responds or timeout)
142
- const response = await sdk.sendMessage(
143
- "Give me the last 5 tweets from @elonmusk?",
144
- {
145
- waitForResponse: true,
146
- timeout: 30000, // 30 seconds
147
- format: "both" // Get both raw data and humanized text
148
- }
149
- );
200
+ const response = await sdk.sendMessage("Give me the last 5 tweets from @elonmusk?", {
201
+ waitForResponse: true,
202
+ timeout: 30000, // 30 seconds
203
+ format: "both" // Get both raw data and humanized text
204
+ });
150
205
 
151
206
  console.log("Agent:", response.agentName);
152
207
  console.log("Answer:", response.humanized);
@@ -184,7 +239,6 @@ console.log("Active rooms:", rooms);
184
239
  // Output: Active rooms: ['Crawler Room', 'KOL tracker']
185
240
  ```
186
241
 
187
-
188
242
  ### Example 3: Webhook Integration
189
243
 
190
244
  Receive agent responses via HTTP POST to your server:
@@ -221,7 +275,7 @@ const sdk = new TeneoSDK({
221
275
  privateKey: process.env.PRIVATE_KEY!,
222
276
  webhookUrl: "https://your-webhook.com/",
223
277
  webhookHeaders: {
224
- "Authorization": "Bearer your-secret-token"
278
+ Authorization: "Bearer your-secret-token"
225
279
  }
226
280
  });
227
281
 
@@ -243,6 +297,465 @@ console.log("Circuit state:", status.circuitState); // OPEN/CLOSED/HALF_OPEN
243
297
 
244
298
  ---
245
299
 
300
+ ## WebSocket Endpoints
301
+
302
+ The Teneo SDK supports two deployment environments via different WebSocket endpoints:
303
+
304
+ ### Development Platform (Testing)
305
+
306
+ - **URL**: `wss://backend.developer.chatroom.teneo-protocol.ai/ws`
307
+ - **Whitelist**: Not required - open for testing
308
+ - **Use case**: Development, testing, and experimentation
309
+
310
+ **Configuration:**
311
+ ```bash
312
+ # .env file
313
+ TENEO_WS_URL=wss://backend.developer.chatroom.teneo-protocol.ai/ws
314
+ ```
315
+
316
+ ### Production Platform (B2B)
317
+
318
+ - **URL**: `wss://backend.chatroom.teneo-protocol.ai/ws`
319
+ - **Whitelist**: **Required** - you must be whitelisted to use this endpoint
320
+ - **Use case**: Production applications and B2B integrations
321
+ - **Get access**: Request whitelist access at [https://teneo-protocol.ai/chat-room](https://teneo-protocol.ai/chat-room)
322
+
323
+ **Configuration:**
324
+ ```bash
325
+ # .env file
326
+ TENEO_WS_URL=wss://backend.chatroom.teneo-protocol.ai/ws
327
+ ```
328
+
329
+
330
+ > **Note**: The SDK uses the **development endpoint by default**. For production use, you need to be whitelisted and explicitly configure the production URL. Use the development endpoint for testing without restrictions.
331
+
332
+ ---
333
+ ## 🏠 Room Management API
334
+
335
+ Create and manage multiple rooms for different contexts and use cases.
336
+
337
+ ### Creating Rooms
338
+
339
+ ```typescript
340
+ // Create a new room
341
+ const room = await sdk.createRoom({
342
+ name: "Crypto Research",
343
+ description: "Room for crypto analysis"
344
+ });
345
+ console.log(`Created room: ${room.id}`);
346
+
347
+ // Check if you can create more rooms
348
+ if (sdk.canCreateRoom()) {
349
+ await sdk.createRoom({ name: "Gaming Room" });
350
+ } else {
351
+ console.log(`Room limit reached: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
352
+ }
353
+ ```
354
+
355
+ ### Querying Rooms
356
+
357
+ ```typescript
358
+ // Get all owned rooms (rooms you created)
359
+ const ownedRooms = sdk.getOwnedRooms();
360
+ console.log(`You own ${ownedRooms.length} rooms:`);
361
+ ownedRooms.forEach((room) => {
362
+ console.log(` - ${room.name} (${room.is_public ? "Public" : "Private"})`);
363
+ });
364
+
365
+ // Get shared rooms (rooms you were invited to)
366
+ const sharedRooms = sdk.getSharedRooms();
367
+ console.log(`You have access to ${sharedRooms.length} shared rooms`);
368
+
369
+ // Get all rooms (owned + shared)
370
+ const allRooms = sdk.getAllRooms();
371
+ console.log(`Total rooms accessible: ${allRooms.length}`);
372
+
373
+ // Get specific room by ID
374
+ const room = sdk.getRoomById("room-123");
375
+ if (room) {
376
+ console.log(`Room: ${room.name}`);
377
+ console.log(`Created by: ${room.created_by}`);
378
+ console.log(`You are ${room.is_owner ? "owner" : "member"}`);
379
+ }
380
+
381
+ // Check room limits
382
+ console.log(`Room capacity: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
383
+ ```
384
+
385
+ ### Updating Rooms
386
+
387
+ ```typescript
388
+ // Update room details (owner only)
389
+ const updated = await sdk.updateRoom("room-123", {
390
+ name: "Updated Room Name",
391
+ description: "New description"
392
+ });
393
+
394
+ console.log(`Room updated: ${updated.name}`);
395
+ ```
396
+
397
+ ### Deleting Rooms
398
+
399
+ ```typescript
400
+ // Delete a room you own
401
+ await sdk.deleteRoom("room-123");
402
+ console.log("Room deleted");
403
+
404
+ // Listen for deletion events
405
+ sdk.on("room:deleted", (roomId) => {
406
+ console.log(`Room ${roomId} was deleted`);
407
+ });
408
+ ```
409
+
410
+ ### Room Events
411
+
412
+ ```typescript
413
+ // Room lifecycle events
414
+ sdk.on("room:created", (room) => {
415
+ console.log(`✅ Created: ${room.name}`);
416
+ });
417
+
418
+ sdk.on("room:updated", (room) => {
419
+ console.log(`📝 Updated: ${room.name}`);
420
+ });
421
+
422
+ sdk.on("room:deleted", (roomId) => {
423
+ console.log(`🗑️ Deleted: ${roomId}`);
424
+ });
425
+
426
+ // Error handling
427
+ sdk.on("room:create_error", (error) => {
428
+ console.error(`Failed to create room: ${error.message}`);
429
+ });
430
+
431
+ sdk.on("room:update_error", (error, roomId) => {
432
+ console.error(`Failed to update room ${roomId}: ${error.message}`);
433
+ });
434
+
435
+ sdk.on("room:delete_error", (error, roomId) => {
436
+ console.error(`Failed to delete room ${roomId}: ${error.message}`);
437
+ });
438
+ ```
439
+
440
+ ---
441
+
442
+ ## 🤖 Agent Room Management API
443
+
444
+ Customize which agents are available in each of your rooms.
445
+
446
+ ### Adding Agents to Rooms
447
+
448
+ ```typescript
449
+ // Add an agent to your room (owner only)
450
+ await sdk.addAgentToRoom("room-123", "agent-456");
451
+ console.log("Agent added to room");
452
+
453
+ // Listen for confirmation
454
+ sdk.on("agent_room:agent_added", (roomId, agentId) => {
455
+ console.log(`✅ Agent ${agentId} added to room ${roomId}`);
456
+ });
457
+ ```
458
+
459
+ ### Removing Agents from Rooms
460
+
461
+ ```typescript
462
+ // Remove an agent from your room (owner only)
463
+ await sdk.removeAgentFromRoom("room-123", "agent-456");
464
+ console.log("Agent removed from room");
465
+
466
+ // Listen for confirmation
467
+ sdk.on("agent_room:agent_removed", (roomId, agentId) => {
468
+ console.log(`🗑️ Agent ${agentId} removed from room ${roomId}`);
469
+ });
470
+ ```
471
+
472
+ ### Listing Room Agents
473
+
474
+ ```typescript
475
+ // List all agents in a room (with 5-minute cache)
476
+ const roomAgents = await sdk.listRoomAgents("room-123");
477
+ console.log(`${roomAgents.length} agents in this room:`);
478
+ roomAgents.forEach((agent) => {
479
+ console.log(` - ${agent.agent_name} (${agent.status})`);
480
+ if (agent.capabilities) {
481
+ console.log(` Capabilities: ${agent.capabilities.map((c) => c.name).join(", ")}`);
482
+ }
483
+ });
484
+
485
+ // Force refresh (bypass cache)
486
+ const freshAgents = await sdk.listRoomAgents("room-123", false);
487
+ ```
488
+
489
+ ### Listing Available Agents
490
+
491
+ ```typescript
492
+ // List agents NOT yet in the room (available to add)
493
+ const available = await sdk.listAvailableAgents("room-123");
494
+ console.log(`${available.length} agents available to add:`);
495
+ available.forEach((agent) => {
496
+ console.log(` - ${agent.agent_name}`);
497
+ if (agent.description) {
498
+ console.log(` ${agent.description}`);
499
+ }
500
+ });
501
+ ```
502
+
503
+ ### Query Methods (Synchronous - from cache)
504
+
505
+ ```typescript
506
+ // Check if specific agent is in room (instant, no network call)
507
+ const isInRoom = sdk.isAgentInRoom("room-123", "agent-456");
508
+ if (isInRoom === true) {
509
+ console.log("Agent is in the room");
510
+ } else if (isInRoom === false) {
511
+ console.log("Agent is NOT in the room");
512
+ } else {
513
+ console.log("Cache not available - call listRoomAgents() first");
514
+ }
515
+
516
+ // Get room agent count (instant)
517
+ const count = sdk.getRoomAgentCount("room-123");
518
+ if (count !== undefined) {
519
+ console.log(`Room has ${count} agents`);
520
+ }
521
+
522
+ // Get cached room agents (instant)
523
+ const cached = sdk.getRoomAgents("room-123");
524
+ if (cached) {
525
+ console.log("Agents:", cached.map((a) => a.agent_name).join(", "));
526
+ } else {
527
+ console.log("No cached data - call listRoomAgents() first");
528
+ }
529
+
530
+ // Get cached available agents (instant)
531
+ const cachedAvailable = sdk.getAvailableAgents("room-123");
532
+ ```
533
+
534
+ ### Cache Management
535
+
536
+ ```typescript
537
+ // Caching behavior:
538
+ // - listRoomAgents() and listAvailableAgents() cache results for 5 minutes
539
+ // - Cache automatically invalidated when you add/remove agents
540
+ // - Cache automatically invalidated on agent status updates
541
+
542
+ // Manual cache invalidation (if needed)
543
+ sdk.invalidateAgentRoomCache("room-123");
544
+ console.log("Cache cleared for room-123");
545
+ ```
546
+
547
+ ### Agent Room Events
548
+
549
+ ```typescript
550
+ // Agent add/remove events
551
+ sdk.on("agent_room:agent_added", (roomId, agentId) => {
552
+ console.log(`✅ Agent ${agentId} added to ${roomId}`);
553
+ });
554
+
555
+ sdk.on("agent_room:agent_removed", (roomId, agentId) => {
556
+ console.log(`🗑️ Agent ${agentId} removed from ${roomId}`);
557
+ });
558
+
559
+ // List events
560
+ sdk.on("agent_room:agents_listed", (roomId, agents) => {
561
+ console.log(`📋 ${agents.length} agents in room ${roomId}`);
562
+ });
563
+
564
+ sdk.on("agent_room:available_agents_listed", (agents) => {
565
+ console.log(`📋 ${agents.length} agents available to add`);
566
+ });
567
+
568
+ // Status updates (real-time)
569
+ sdk.on("agent_room:status_update", (data) => {
570
+ console.log(`🔄 Agent ${data.agentId} status updated in room ${data.roomId}`);
571
+ console.log(` New status: ${data.status}`);
572
+ });
573
+
574
+ // Error handling
575
+ sdk.on("agent_room:add_error", (error, roomId) => {
576
+ console.error(`Failed to add agent to ${roomId}: ${error.message}`);
577
+ });
578
+
579
+ sdk.on("agent_room:remove_error", (error, roomId) => {
580
+ console.error(`Failed to remove agent from ${roomId}: ${error.message}`);
581
+ });
582
+
583
+ sdk.on("agent_room:list_error", (error, roomId) => {
584
+ console.error(`Failed to list agents in ${roomId}: ${error.message}`);
585
+ });
586
+
587
+ sdk.on("agent_room:list_available_error", (error, roomId) => {
588
+ console.error(`Failed to list available agents for ${roomId}: ${error.message}`);
589
+ });
590
+ ```
591
+
592
+ ### Complete Example: Room Setup
593
+
594
+ ```typescript
595
+ // Complete workflow: Create room and customize agents
596
+ async function setupCustomRoom() {
597
+ // 1. Create a new room
598
+ const room = await sdk.createRoom({
599
+ name: "My Custom Room",
600
+ description: "Specialized agent room"
601
+ });
602
+ console.log(`✅ Created room: ${room.id}`);
603
+
604
+ // 2. See what agents are available
605
+ const available = await sdk.listAvailableAgents(room.id);
606
+ console.log(`${available.length} agents available`);
607
+
608
+ // 3. Add specific agents you want
609
+ const cryptoAgent = available.find((a) => a.agent_name?.includes("Crypto"));
610
+ if (cryptoAgent) {
611
+ await sdk.addAgentToRoom(room.id, cryptoAgent.agent_id);
612
+ console.log(`✅ Added ${cryptoAgent.agent_name}`);
613
+ }
614
+
615
+ const analyticsAgent = available.find((a) => a.agent_name?.includes("Analytics"));
616
+ if (analyticsAgent) {
617
+ await sdk.addAgentToRoom(room.id, analyticsAgent.agent_id);
618
+ console.log(`✅ Added ${analyticsAgent.agent_name}`);
619
+ }
620
+
621
+ // 4. Verify room configuration
622
+ const roomAgents = await sdk.listRoomAgents(room.id);
623
+ console.log(`\n🎯 Room configured with ${roomAgents.length} agents:`);
624
+ roomAgents.forEach((agent) => {
625
+ console.log(` - ${agent.agent_name}`);
626
+ });
627
+
628
+ // 5. Now send messages to this room
629
+ await sdk.sendMessage("Analyze BTC price trends", { room: room.id });
630
+ }
631
+
632
+ setupCustomRoom();
633
+ ```
634
+
635
+ ---
636
+
637
+ ## 💰 Payment Flow API
638
+
639
+ The SDK supports automatic micropayments to AI agents using the x402 protocol.
640
+
641
+ ### Basic Usage (Auto-Approve)
642
+
643
+ ```typescript
644
+ import { TeneoSDK } from "@teneo-protocol/sdk";
645
+
646
+ // Enable payments with auto-approve
647
+ const sdk = new TeneoSDK(
648
+ TeneoSDK.builder()
649
+ .withWebSocketUrl("wss://backend.developer.chatroom.teneo-protocol.ai/ws")
650
+ .withAuthentication(process.env.PRIVATE_KEY!)
651
+ .withPayments({
652
+ autoApprove: true, // Automatically approve quotes
653
+ maxPricePerRequest: 1000000 // Max 1 USDC per request (in micro-units)
654
+ })
655
+ .build()
656
+ );
657
+
658
+ await sdk.connect();
659
+
660
+ // Send message - payment handled automatically
661
+ const response = await sdk.sendMessage("@x-agent-enterprise-v2 user @elonmusk", {
662
+ room: roomId,
663
+ waitForResponse: true
664
+ });
665
+
666
+ console.log(response.humanized);
667
+ // Output: User profile for @elonmusk...
668
+ ```
669
+
670
+ ### Direct Agent Commands
671
+
672
+ ```typescript
673
+ // Target a specific agent directly
674
+ await sdk.sendMessage("@x-agent-enterprise-v2 timeline @elonmusk 5", {
675
+ room: roomId,
676
+ waitForResponse: true
677
+ });
678
+
679
+ // Let the coordinator choose the best agent
680
+ await sdk.sendMessage("Get me the latest tweets from @elonmusk", {
681
+ room: roomId,
682
+ waitForResponse: true
683
+ });
684
+ ```
685
+
686
+ ### Payment Events
687
+
688
+ ```typescript
689
+ // Quote received from agent
690
+ sdk.on("quote:received", (quote) => {
691
+ console.log(`Quote: ${quote.data.pricing.pricePerUnit} USDC`);
692
+ console.log(`Agent: ${quote.data.agent_name}`);
693
+ console.log(`Expires: ${quote.data.expires_at}`);
694
+ });
695
+
696
+ // Payment attached to request
697
+ sdk.on("payment:attached", (data) => {
698
+ console.log(`Paid ${data.amount / 1_000_000} USDC to ${data.agentId}`);
699
+ });
700
+
701
+ // Payment errors
702
+ sdk.on("payment:error", (error) => {
703
+ console.error(`Payment failed: ${error.message}`);
704
+ });
705
+ ```
706
+
707
+ ### Manual Quote Approval
708
+
709
+ ```typescript
710
+ const sdk = new TeneoSDK(
711
+ TeneoSDK.builder()
712
+ .withWebSocketUrl("wss://...")
713
+ .withAuthentication(privateKey)
714
+ .withPayments({
715
+ autoApprove: false // Require manual approval
716
+ })
717
+ .build()
718
+ );
719
+
720
+ // Listen for quotes
721
+ sdk.on("quote:received", async (quote) => {
722
+ const price = quote.data.pricing.pricePerUnit;
723
+
724
+ // Check price before approving
725
+ if (price <= 0.01) {
726
+ // Approve and send payment
727
+ await sdk.confirmQuote(quote.data.task_id);
728
+ } else {
729
+ console.log(`Quote too expensive: $${price}`);
730
+ }
731
+ });
732
+
733
+ // Request triggers quote
734
+ await sdk.sendMessage("@x-agent user @elonmusk", { room: roomId });
735
+ ```
736
+
737
+ ### Payment Flow Diagram
738
+
739
+ ```
740
+ Your App Teneo Backend Agent
741
+ │ │ │
742
+ │──── request_task ──────────>│ │
743
+ │ │────── select agent ─────>│
744
+ │<───── task_quote ───────────│<────── pricing ──────────│
745
+ │ │ │
746
+ │ [Auto-approve or manual] │ │
747
+ │ │ │
748
+ │──── confirm_task ──────────>│ │
749
+ │ + x402 payment header │────── execute task ─────>│
750
+ │ │ │
751
+ │<───── task_response ────────│<────── response ─────────│
752
+ │ │ │
753
+ │ │──── settle payment ─────>│
754
+ └ └ └
755
+ ```
756
+
757
+ ---
758
+
246
759
  ## 🎨 Event System
247
760
 
248
761
  The SDK is fully event-driven. Subscribe to what matters:
@@ -254,7 +767,9 @@ sdk.on("connection:open", () => console.log("🔌 WebSocket connected"));
254
767
  sdk.on("connection:close", (code, reason) => console.log(`❌ Disconnected: ${reason}`));
255
768
  sdk.on("connection:reconnecting", (attempt) => console.log(`🔄 Reconnecting (attempt ${attempt})`));
256
769
 
257
- sdk.on("auth:challenge", (challenge) => console.log("🔐 Challenge received, signing with wallet..."));
770
+ sdk.on("auth:challenge", (challenge) =>
771
+ console.log("🔐 Challenge received, signing with wallet...")
772
+ );
258
773
  sdk.on("auth:success", (state) => {
259
774
  console.log(`✅ Authenticated as ${state.walletAddress}`);
260
775
  console.log(`Whitelisted: ${state.isWhitelisted}`);
@@ -277,7 +792,7 @@ sdk.on("agent:response", (response) => {
277
792
 
278
793
  sdk.on("agent:list", (agents) => {
279
794
  console.log(`📋 Agent list updated: ${agents.length} agents available`);
280
- agents.forEach(agent => {
795
+ agents.forEach((agent) => {
281
796
  console.log(` - ${agent.name}: ${agent.capabilities?.join(", ")}`);
282
797
  });
283
798
  });
@@ -304,7 +819,7 @@ sdk.on("room:unsubscribed", (data) => {
304
819
 
305
820
  ```typescript
306
821
  const sdk = new TeneoSDK({
307
- wsUrl: "wss://developer.chatroom.teneo-protocol.ai/ws",
822
+ wsUrl: "wss://backend.developer.chatroom.teneo-protocol.ai/ws",
308
823
  privateKey: "your_key", // No 0x prefix
309
824
  defaultRoom: "general",
310
825
  reconnect: true,
@@ -322,7 +837,7 @@ const secureKey = new SecurePrivateKey(process.env.PRIVATE_KEY!);
322
837
 
323
838
  const config = new SDKConfigBuilder()
324
839
  // Required
325
- .withWebSocketUrl("wss://developer.chatroom.teneo-protocol.ai/ws")
840
+ .withWebSocketUrl("wss://backend.developer.chatroom.teneo-protocol.ai/ws")
326
841
  .withAuthentication(secureKey) // Encrypted key
327
842
 
328
843
  // Rooms
@@ -331,15 +846,15 @@ const config = new SDKConfigBuilder()
331
846
  // Reconnection strategy
332
847
  .withReconnectionStrategy({
333
848
  type: "exponential",
334
- baseDelay: 3000, // Start at 3 seconds
335
- maxDelay: 120000, // Cap at 2 minutes
849
+ baseDelay: 3000, // Start at 3 seconds
850
+ maxDelay: 120000, // Cap at 2 minutes
336
851
  maxAttempts: 20,
337
- jitter: true // Prevent thundering herd
852
+ jitter: true // Prevent thundering herd
338
853
  })
339
854
 
340
855
  // Webhook with retry
341
856
  .withWebhook("https://your-server.com/webhook", {
342
- "Authorization": "Bearer token"
857
+ Authorization: "Bearer token"
343
858
  })
344
859
  .withWebhookRetryStrategy({
345
860
  type: "exponential",
@@ -350,7 +865,7 @@ const config = new SDKConfigBuilder()
350
865
 
351
866
  // Response formatting
352
867
  .withResponseFormat({
353
- format: "both", // 'raw' | 'humanized' | 'both'
868
+ format: "both", // 'raw' | 'humanized' | 'both'
354
869
  includeMetadata: true
355
870
  })
356
871
 
@@ -362,7 +877,7 @@ const config = new SDKConfigBuilder()
362
877
  })
363
878
 
364
879
  // Performance
365
- .withRateLimit(10, 20) // 10 msg/sec, burst 20
880
+ .withRateLimit(10, 20) // 10 msg/sec, burst 20
366
881
  .withMessageDeduplication(true, 60000, 10000)
367
882
  .withLogging("debug")
368
883
 
@@ -376,7 +891,7 @@ const sdk = new TeneoSDK(config);
376
891
  Create `.env`:
377
892
 
378
893
  ```bash
379
- TENEO_WS_URL=wss://developer.chatroom.teneo-protocol.ai/ws
894
+ TENEO_WS_URL=wss://backend.developer.chatroom.teneo-protocol.ai/ws
380
895
  PRIVATE_KEY=your_private_key_without_0x
381
896
  WALLET_ADDRESS=0xYourWalletAddress
382
897
  DEFAULT_ROOM=general
@@ -448,11 +963,11 @@ console.log("Circuit state:", status.circuitState);
448
963
 
449
964
  Configurable exponential backoff, linear, or constant delays:
450
965
 
451
- | Strategy | Formula | Example (base=2s, mult=2) |
452
- |----------|---------|---------------------------|
453
- | **Exponential** | `base * mult^attempt` | 2s, 4s, 8s, 16s, 32s |
454
- | **Linear** | `base * attempt` | 2s, 4s, 6s, 8s, 10s |
455
- | **Constant** | `base` | 2s, 2s, 2s, 2s, 2s |
966
+ | Strategy | Formula | Example (base=2s, mult=2) |
967
+ | --------------- | --------------------- | ------------------------- |
968
+ | **Exponential** | `base * mult^attempt` | 2s, 4s, 8s, 16s, 32s |
969
+ | **Linear** | `base * attempt` | 2s, 4s, 6s, 8s, 10s |
970
+ | **Constant** | `base` | 2s, 2s, 2s, 2s, 2s |
456
971
 
457
972
  ```typescript
458
973
  const config = new SDKConfigBuilder()
@@ -461,7 +976,7 @@ const config = new SDKConfigBuilder()
461
976
  baseDelay: 3000,
462
977
  maxDelay: 120000,
463
978
  maxAttempts: 20,
464
- jitter: true // Add 0-1000ms randomness
979
+ jitter: true // Add 0-1000ms randomness
465
980
  })
466
981
  .build();
467
982
  ```
@@ -473,9 +988,9 @@ Prevents duplicate message processing with TTL-based cache:
473
988
  ```typescript
474
989
  const config = new SDKConfigBuilder()
475
990
  .withMessageDeduplication(
476
- true, // Enable
477
- 300000, // 5 minute TTL
478
- 10000 // Cache up to 10k message IDs
991
+ true, // Enable
992
+ 300000, // 5 minute TTL
993
+ 10000 // Cache up to 10k message IDs
479
994
  )
480
995
  .build();
481
996
 
@@ -569,6 +1084,7 @@ if (dedup) {
569
1084
  ### Issue: "ERR_REQUIRE_ESM" Error
570
1085
 
571
1086
  **Problem:**
1087
+
572
1088
  ```
573
1089
  Error [ERR_REQUIRE_ESM]: require() of ES Module node-fetch not supported
574
1090
  ```
@@ -585,6 +1101,7 @@ npx ts-node your-app.ts
585
1101
  ```
586
1102
 
587
1103
  **Alternative:** Install node-fetch v2:
1104
+
588
1105
  ```bash
589
1106
  npm install node-fetch@2.7.0
590
1107
  npm run build
@@ -596,19 +1113,22 @@ npm run build
596
1113
 
597
1114
  **Solutions:**
598
1115
 
599
- 1. **Check private key format (64 hex characters, no 0x):**
1116
+ 1. **Check private key format (64 hex characters, + 0x prefix):**
1117
+
600
1118
  ```typescript
601
- // ✅ Good
602
- privateKey: "dafe885a73d87dc34b7933068423b40a646adf5cef45954265e9a1b9be6bad9d"
1119
+ // ✅ Good - 64 hex characters after 0x prefix
1120
+ privateKey: "0x1234567890123456789012345678901234567890123456789012345678901234";
603
1121
  ```
604
1122
 
605
1123
  2. **Verify key length:**
1124
+
606
1125
  ```bash
607
1126
  echo -n "your_key" | wc -c
608
- # Should output: 64
1127
+ # Should output: 64 + 0x prefix
609
1128
  ```
610
1129
 
611
1130
  3. **Enable debug logging:**
1131
+
612
1132
  ```typescript
613
1133
  const sdk = new TeneoSDK({
614
1134
  wsUrl: "...",
@@ -620,6 +1140,7 @@ npm run build
620
1140
  ### Issue: Rate Limiting
621
1141
 
622
1142
  **Problem:**
1143
+
623
1144
  ```
624
1145
  RateLimitError: Rate limit exceeded
625
1146
  ```
@@ -630,7 +1151,7 @@ RateLimitError: Rate limit exceeded
630
1151
  ```typescript
631
1152
  for (const message of messages) {
632
1153
  await sdk.sendMessage(message);
633
- await new Promise(r => setTimeout(r, 200)); // 200ms delay
1154
+ await new Promise((r) => setTimeout(r, 200)); // 200ms delay
634
1155
  }
635
1156
  ```
636
1157
 
@@ -639,16 +1160,18 @@ RateLimitError: Rate limit exceeded
639
1160
  **Solutions:**
640
1161
 
641
1162
  1. **Verify HTTPS (except localhost):**
1163
+
642
1164
  ```typescript
643
1165
  // ✅ Good
644
- webhookUrl: "https://your-server.com/webhook"
645
- webhookUrl: "http://localhost:3000/webhook"
1166
+ webhookUrl: "https://your-server.com/webhook";
1167
+ webhookUrl: "http://localhost:3000/webhook";
646
1168
 
647
1169
  // ❌ Bad
648
- webhookUrl: "http://your-server.com/webhook"
1170
+ webhookUrl: "http://your-server.com/webhook";
649
1171
  ```
650
1172
 
651
1173
  2. **Test manually:**
1174
+
652
1175
  ```bash
653
1176
  curl -X POST https://your-server.com/webhook \
654
1177
  -H "Content-Type: application/json" \
@@ -676,8 +1199,9 @@ npm run test:integration # Integration tests
676
1199
  ```
677
1200
 
678
1201
  **Test Results:**
679
- - ✅ 488 unit tests passing
680
- - ✅ 98.6% pass rate
1202
+
1203
+ - ✅ 671 unit tests passing
1204
+ - ✅ 100% pass rate (Phase 0-2 complete)
681
1205
  - ✅ Comprehensive coverage
682
1206
 
683
1207
  ---
@@ -701,7 +1225,6 @@ We welcome contributions!
701
1225
 
702
1226
  AGPL-3.0 License
703
1227
 
704
-
705
1228
  <div align="center">
706
1229
 
707
1230
  **Built with ❤️ by the [Teneo Team](https://teneo.pro)**