@teneo-protocol/sdk 1.0.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/.eslintrc.json +11 -2
  2. package/.github/CODEOWNERS +2 -0
  3. package/.github/ISSUE_TEMPLATE/01-bug.yml +85 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  6. package/.github/workflows/claude-code-review.yml +8 -3
  7. package/.github/workflows/claude-reviewer.yml +6 -4
  8. package/.github/workflows/publish-npm.yml +9 -6
  9. package/.github/workflows/push-to-main.yml +1 -1
  10. package/.github/workflows/top-issue.yml +102 -0
  11. package/CHANGELOG.md +334 -0
  12. package/CONCEPTS.md +747 -0
  13. package/README.md +577 -54
  14. package/dist/constants.js +8 -8
  15. package/dist/constants.js.map +1 -1
  16. package/dist/core/websocket-client.d.ts +25 -1
  17. package/dist/core/websocket-client.d.ts.map +1 -1
  18. package/dist/core/websocket-client.js +74 -15
  19. package/dist/core/websocket-client.js.map +1 -1
  20. package/dist/formatters/response-formatter.js +4 -0
  21. package/dist/formatters/response-formatter.js.map +1 -1
  22. package/dist/handlers/message-handler-registry.js +2 -1
  23. package/dist/handlers/message-handler-registry.js.map +1 -1
  24. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +1666 -0
  25. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts.map +1 -0
  26. package/dist/handlers/message-handlers/agent-details-response-handler.js +38 -0
  27. package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -0
  28. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
  29. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
  30. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +67 -0
  31. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
  32. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
  33. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  34. package/dist/handlers/message-handlers/agent-selected-handler.js +2 -5
  35. package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -1
  36. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +1687 -0
  37. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
  38. package/dist/handlers/message-handlers/agent-status-update-handler.js +48 -0
  39. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
  40. package/dist/handlers/message-handlers/agents-list-handler.js +2 -5
  41. package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -1
  42. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +439 -0
  43. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -0
  44. package/dist/handlers/message-handlers/all-agents-response-handler.js +36 -0
  45. package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -0
  46. package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
  47. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  48. package/dist/handlers/message-handlers/auth-error-handler.js +2 -5
  49. package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -1
  50. package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
  51. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  52. package/dist/handlers/message-handlers/auth-message-handler.js +71 -10
  53. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  54. package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
  55. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  56. package/dist/handlers/message-handlers/auth-required-handler.js +2 -5
  57. package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -1
  58. package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
  59. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  60. package/dist/handlers/message-handlers/auth-success-handler.js +52 -9
  61. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  62. package/dist/handlers/message-handlers/base-handler.d.ts +4 -4
  63. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
  64. package/dist/handlers/message-handlers/base-handler.js +3 -1
  65. package/dist/handlers/message-handlers/base-handler.js.map +1 -1
  66. package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
  67. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  68. package/dist/handlers/message-handlers/challenge-handler.js +3 -2
  69. package/dist/handlers/message-handlers/challenge-handler.js.map +1 -1
  70. package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
  71. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  72. package/dist/handlers/message-handlers/error-message-handler.js +2 -5
  73. package/dist/handlers/message-handlers/error-message-handler.js.map +1 -1
  74. package/dist/handlers/message-handlers/index.d.ts +11 -0
  75. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  76. package/dist/handlers/message-handlers/index.js +55 -1
  77. package/dist/handlers/message-handlers/index.js.map +1 -1
  78. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +1660 -0
  79. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
  80. package/dist/handlers/message-handlers/list-available-agents-handler.js +35 -0
  81. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
  82. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +1669 -0
  83. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
  84. package/dist/handlers/message-handlers/list-room-agents-handler.js +48 -0
  85. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
  86. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +2 -110
  87. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  88. package/dist/handlers/message-handlers/list-rooms-response-handler.js +4 -6
  89. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
  90. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
  91. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  92. package/dist/handlers/message-handlers/ping-pong-handler.js +4 -10
  93. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
  94. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts +94 -0
  95. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -0
  96. package/dist/handlers/message-handlers/rate-limit-notification-handler.js +35 -0
  97. package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -0
  98. package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
  99. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  100. package/dist/handlers/message-handlers/regular-message-handler.js +4 -6
  101. package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
  102. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
  103. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
  104. package/dist/handlers/message-handlers/room-operation-response-handler.js +89 -0
  105. package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
  106. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
  107. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  108. package/dist/handlers/message-handlers/subscribe-response-handler.js +4 -6
  109. package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -1
  110. package/dist/handlers/message-handlers/task-quote-handler.d.ts +14 -0
  111. package/dist/handlers/message-handlers/task-quote-handler.d.ts.map +1 -0
  112. package/dist/handlers/message-handlers/task-quote-handler.js +29 -0
  113. package/dist/handlers/message-handlers/task-quote-handler.js.map +1 -0
  114. package/dist/handlers/message-handlers/task-response-handler.js +2 -5
  115. package/dist/handlers/message-handlers/task-response-handler.js.map +1 -1
  116. package/dist/handlers/message-handlers/types.d.ts +21 -7
  117. package/dist/handlers/message-handlers/types.d.ts.map +1 -1
  118. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
  119. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  120. package/dist/handlers/message-handlers/unsubscribe-response-handler.js +4 -6
  121. package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -1
  122. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts +40 -0
  123. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts.map +1 -0
  124. package/dist/handlers/message-handlers/user-authenticated-handler.js +28 -0
  125. package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -0
  126. package/dist/handlers/message-handlers/user-count-handler.d.ts +49 -0
  127. package/dist/handlers/message-handlers/user-count-handler.d.ts.map +1 -0
  128. package/dist/handlers/message-handlers/user-count-handler.js +31 -0
  129. package/dist/handlers/message-handlers/user-count-handler.js.map +1 -0
  130. package/dist/handlers/webhook-handler.d.ts +1 -1
  131. package/dist/handlers/webhook-handler.d.ts.map +1 -1
  132. package/dist/handlers/webhook-handler.js +14 -5
  133. package/dist/handlers/webhook-handler.js.map +1 -1
  134. package/dist/index.d.ts +6 -1
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +19 -2
  137. package/dist/index.js.map +1 -1
  138. package/dist/managers/admin-manager.d.ts +116 -0
  139. package/dist/managers/admin-manager.d.ts.map +1 -0
  140. package/dist/managers/admin-manager.js +169 -0
  141. package/dist/managers/admin-manager.js.map +1 -0
  142. package/dist/managers/agent-registry.d.ts +52 -1
  143. package/dist/managers/agent-registry.d.ts.map +1 -1
  144. package/dist/managers/agent-registry.js +145 -6
  145. package/dist/managers/agent-registry.js.map +1 -1
  146. package/dist/managers/agent-room-manager.d.ts +216 -0
  147. package/dist/managers/agent-room-manager.d.ts.map +1 -0
  148. package/dist/managers/agent-room-manager.js +555 -0
  149. package/dist/managers/agent-room-manager.js.map +1 -0
  150. package/dist/managers/connection-manager.js +2 -0
  151. package/dist/managers/connection-manager.js.map +1 -1
  152. package/dist/managers/index.d.ts +4 -1
  153. package/dist/managers/index.d.ts.map +1 -1
  154. package/dist/managers/index.js +7 -1
  155. package/dist/managers/index.js.map +1 -1
  156. package/dist/managers/message-router.d.ts +56 -5
  157. package/dist/managers/message-router.d.ts.map +1 -1
  158. package/dist/managers/message-router.js +155 -8
  159. package/dist/managers/message-router.js.map +1 -1
  160. package/dist/managers/room-management-manager.d.ts +213 -0
  161. package/dist/managers/room-management-manager.d.ts.map +1 -0
  162. package/dist/managers/room-management-manager.js +442 -0
  163. package/dist/managers/room-management-manager.js.map +1 -0
  164. package/dist/managers/room-manager.d.ts +11 -9
  165. package/dist/managers/room-manager.d.ts.map +1 -1
  166. package/dist/managers/room-manager.js +14 -10
  167. package/dist/managers/room-manager.js.map +1 -1
  168. package/dist/payments/index.d.ts +5 -0
  169. package/dist/payments/index.d.ts.map +1 -0
  170. package/dist/payments/index.js +21 -0
  171. package/dist/payments/index.js.map +1 -0
  172. package/dist/payments/payment-client.d.ts +74 -0
  173. package/dist/payments/payment-client.d.ts.map +1 -0
  174. package/dist/payments/payment-client.js +207 -0
  175. package/dist/payments/payment-client.js.map +1 -0
  176. package/dist/teneo-sdk.d.ts +467 -33
  177. package/dist/teneo-sdk.d.ts.map +1 -1
  178. package/dist/teneo-sdk.js +735 -26
  179. package/dist/teneo-sdk.js.map +1 -1
  180. package/dist/types/categories.d.ts +22 -0
  181. package/dist/types/categories.d.ts.map +1 -0
  182. package/dist/types/categories.js +40 -0
  183. package/dist/types/categories.js.map +1 -0
  184. package/dist/types/config.d.ts +134 -54
  185. package/dist/types/config.d.ts.map +1 -1
  186. package/dist/types/config.js +70 -9
  187. package/dist/types/config.js.map +1 -1
  188. package/dist/types/error-codes.d.ts +10 -0
  189. package/dist/types/error-codes.d.ts.map +1 -1
  190. package/dist/types/error-codes.js +12 -0
  191. package/dist/types/error-codes.js.map +1 -1
  192. package/dist/types/events.d.ts +176 -68
  193. package/dist/types/events.d.ts.map +1 -1
  194. package/dist/types/events.js +19 -1
  195. package/dist/types/events.js.map +1 -1
  196. package/dist/types/index.d.ts +3 -2
  197. package/dist/types/index.d.ts.map +1 -1
  198. package/dist/types/index.js +57 -2
  199. package/dist/types/index.js.map +1 -1
  200. package/dist/types/messages.d.ts +22225 -2592
  201. package/dist/types/messages.d.ts.map +1 -1
  202. package/dist/types/messages.js +537 -28
  203. package/dist/types/messages.js.map +1 -1
  204. package/dist/utils/bounded-queue.d.ts.map +1 -1
  205. package/dist/utils/bounded-queue.js +5 -2
  206. package/dist/utils/bounded-queue.js.map +1 -1
  207. package/dist/utils/circuit-breaker.js +11 -4
  208. package/dist/utils/circuit-breaker.js.map +1 -1
  209. package/dist/utils/deduplication-cache.js +3 -1
  210. package/dist/utils/deduplication-cache.js.map +1 -1
  211. package/dist/utils/event-waiter.d.ts +3 -3
  212. package/dist/utils/event-waiter.d.ts.map +1 -1
  213. package/dist/utils/index.d.ts +1 -0
  214. package/dist/utils/index.d.ts.map +1 -1
  215. package/dist/utils/index.js +4 -1
  216. package/dist/utils/index.js.map +1 -1
  217. package/dist/utils/logger.js.map +1 -1
  218. package/dist/utils/pricing-resolver.d.ts +26 -0
  219. package/dist/utils/pricing-resolver.d.ts.map +1 -0
  220. package/dist/utils/pricing-resolver.js +85 -0
  221. package/dist/utils/pricing-resolver.js.map +1 -0
  222. package/dist/utils/rate-limiter.d.ts.map +1 -1
  223. package/dist/utils/rate-limiter.js +6 -0
  224. package/dist/utils/rate-limiter.js.map +1 -1
  225. package/dist/utils/retry-policy.js +1 -0
  226. package/dist/utils/retry-policy.js.map +1 -1
  227. package/dist/utils/secure-private-key.js +3 -1
  228. package/dist/utils/secure-private-key.js.map +1 -1
  229. package/dist/utils/signature-verifier.d.ts.map +1 -1
  230. package/dist/utils/signature-verifier.js +3 -1
  231. package/dist/utils/signature-verifier.js.map +1 -1
  232. package/examples/.env.example +2 -2
  233. package/examples/agent-room-management-example.ts +335 -0
  234. package/examples/basic-usage.ts +3 -4
  235. package/examples/claude-agent-x-follower/.env.example +3 -3
  236. package/examples/claude-agent-x-follower/QUICKSTART.md +3 -3
  237. package/examples/claude-agent-x-follower/README.md +3 -3
  238. package/examples/claude-agent-x-follower/index.ts +120 -96
  239. package/examples/n8n-teneo/.env.example +3 -3
  240. package/examples/n8n-teneo/README.md +2 -2
  241. package/examples/n8n-teneo/index.ts +54 -44
  242. package/examples/nestjs-dashboard/.env.example +11 -0
  243. package/examples/nestjs-dashboard/README.md +297 -0
  244. package/examples/nestjs-dashboard/nest-cli.json +10 -0
  245. package/examples/nestjs-dashboard/package.json +44 -0
  246. package/examples/nestjs-dashboard/pnpm-lock.yaml +3079 -0
  247. package/examples/nestjs-dashboard/src/app.controller.ts +24 -0
  248. package/examples/nestjs-dashboard/src/app.module.ts +15 -0
  249. package/examples/nestjs-dashboard/src/main.ts +32 -0
  250. package/examples/nestjs-dashboard/src/public/dashboard.html +1144 -0
  251. package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +54 -0
  252. package/examples/nestjs-dashboard/src/teneo/events.controller.ts +65 -0
  253. package/examples/nestjs-dashboard/src/teneo/messages.controller.ts +47 -0
  254. package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +258 -0
  255. package/examples/nestjs-dashboard/src/teneo/teneo.module.ts +13 -0
  256. package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +484 -0
  257. package/examples/nestjs-dashboard/tsconfig.json +22 -0
  258. package/examples/openai-teneo/.env.example +3 -3
  259. package/examples/openai-teneo/README.md +3 -3
  260. package/examples/openai-teneo/index.ts +82 -71
  261. package/examples/production-dashboard/.env.example +3 -3
  262. package/examples/production-dashboard/README.md +90 -13
  263. package/examples/production-dashboard/public/dashboard.html +1173 -601
  264. package/examples/production-dashboard/server.ts +349 -7
  265. package/examples/room-management-example.ts +282 -0
  266. package/examples/usage/.env.example +2 -2
  267. package/examples/usage/01-connect.ts +3 -4
  268. package/examples/usage/02-list-agents.ts +2 -3
  269. package/examples/usage/03-pick-agent.ts +2 -3
  270. package/examples/usage/04-find-by-capability.ts +2 -3
  271. package/examples/usage/05-webhook-example.ts +2 -3
  272. package/examples/usage/06-simple-api-server.ts +2 -3
  273. package/examples/usage/07-event-listener.ts +2 -3
  274. package/examples/usage/README.md +1 -1
  275. package/examples/webhook-integration.ts +1 -1
  276. package/examples/x-influencer-battle-server.ts +2 -2
  277. package/package.json +12 -1
  278. package/src/core/websocket-client.test.ts +8 -3
  279. package/src/core/websocket-client.ts +58 -4
  280. package/src/formatters/response-formatter.test.ts +2 -0
  281. package/src/formatters/response-formatter.ts +3 -3
  282. package/src/handlers/message-handlers/agent-details-response-handler.ts +42 -0
  283. package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +77 -0
  284. package/src/handlers/message-handlers/agent-status-update-handler.ts +52 -0
  285. package/src/handlers/message-handlers/all-agents-response-handler.ts +39 -0
  286. package/src/handlers/message-handlers/auth-message-handler.ts +78 -5
  287. package/src/handlers/message-handlers/auth-success-handler.ts +63 -6
  288. package/src/handlers/message-handlers/base-handler.ts +20 -7
  289. package/src/handlers/message-handlers/index.ts +53 -0
  290. package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
  291. package/src/handlers/message-handlers/list-room-agents-handler.ts +58 -0
  292. package/src/handlers/message-handlers/list-rooms-response-handler.ts +4 -2
  293. package/src/handlers/message-handlers/rate-limit-notification-handler.ts +45 -0
  294. package/src/handlers/message-handlers/regular-message-handler.ts +3 -2
  295. package/src/handlers/message-handlers/room-operation-response-handler.ts +102 -0
  296. package/src/handlers/message-handlers/subscribe-response-handler.ts +12 -2
  297. package/src/handlers/message-handlers/task-quote-handler.ts +31 -0
  298. package/src/handlers/message-handlers/types.ts +41 -7
  299. package/src/handlers/message-handlers/unsubscribe-response-handler.ts +12 -2
  300. package/src/handlers/message-handlers/user-authenticated-handler.ts +31 -0
  301. package/src/handlers/message-handlers/user-count-handler.ts +34 -0
  302. package/src/handlers/webhook-handler.test.ts +3 -2
  303. package/src/handlers/webhook-handler.ts +13 -7
  304. package/src/index.ts +21 -0
  305. package/src/managers/admin-manager.ts +249 -0
  306. package/src/managers/agent-registry.test.ts +2 -1
  307. package/src/managers/agent-registry.ts +170 -2
  308. package/src/managers/agent-room-manager.ts +665 -0
  309. package/src/managers/index.ts +15 -1
  310. package/src/managers/message-router.ts +215 -17
  311. package/src/managers/room-management-manager.ts +520 -0
  312. package/src/managers/room-manager.ts +15 -20
  313. package/src/payments/index.ts +22 -0
  314. package/src/payments/payment-client.ts +240 -0
  315. package/src/teneo-sdk.ts +806 -30
  316. package/src/types/categories.ts +45 -0
  317. package/src/types/config.ts +80 -7
  318. package/src/types/error-codes.ts +14 -0
  319. package/src/types/events.test.ts +1 -0
  320. package/src/types/events.ts +67 -0
  321. package/src/types/index.ts +111 -0
  322. package/src/types/messages.test.ts +2 -1
  323. package/src/types/messages.ts +677 -42
  324. package/src/utils/bounded-queue.test.ts +1 -1
  325. package/src/utils/bounded-queue.ts +2 -1
  326. package/src/utils/circuit-breaker.test.ts +1 -1
  327. package/src/utils/deduplication-cache.test.ts +1 -1
  328. package/src/utils/event-waiter.test.ts +1 -1
  329. package/src/utils/event-waiter.ts +3 -3
  330. package/src/utils/index.ts +7 -0
  331. package/src/utils/logger.ts +8 -8
  332. package/src/utils/pricing-resolver.ts +128 -0
  333. package/src/utils/rate-limiter.test.ts +1 -1
  334. package/src/utils/rate-limiter.ts +1 -0
  335. package/src/utils/signature-verifier.test.ts +2 -2
  336. package/src/utils/signature-verifier.ts +3 -2
  337. package/tests/.env.example +7 -0
  338. package/tests/direct-agent-test.ts +151 -0
  339. package/tests/integration/real-server.test.ts +2 -0
  340. package/tests/integration/room-management.test.ts +516 -0
  341. package/tests/integration/websocket.test.ts +5 -2
  342. package/tests/payment-flow-test.ts +147 -0
  343. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +382 -0
  344. package/tests/unit/handlers/agent-status-update-handler.test.ts +403 -0
  345. package/tests/unit/handlers/auth-success-handler-rooms.test.ts +697 -0
  346. package/tests/unit/handlers/list-available-agents-handler.test.ts +248 -0
  347. package/tests/unit/handlers/list-room-agents-handler.test.ts +290 -0
  348. package/tests/unit/handlers/room-operation-response-handler.test.ts +500 -0
  349. package/tests/unit/managers/agent-room-manager.test.ts +527 -0
  350. package/tests/unit/managers/room-management-manager.test.ts +420 -0
  351. package/tsconfig.json +2 -2
  352. package/vitest.config.ts +1 -0
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * MessageRouter - Manages message sending and routing
3
3
  * Handles user messages, direct commands, and message-response patterns
4
+ * Supports quote-approve payment flow (v2.2.0)
4
5
  */
5
6
 
6
7
  import { EventEmitter } from "eventemitter3";
@@ -11,11 +12,15 @@ import { ResponseFormatter, FormattedResponse } from "../formatters/response-for
11
12
  import {
12
13
  UserMessage,
13
14
  createUserMessage,
15
+ createRequestTask,
16
+ createConfirmTask,
14
17
  Logger,
15
18
  ResponseFormat,
16
- TaskResponseMessage
19
+ TaskResponseMessage,
20
+ TaskQuoteMessage,
21
+ PricingInfo
17
22
  } from "../types";
18
- import { SDKEvents, SDKError, ValidationError, AgentResponse } from "../types/events";
23
+ import { SDKEvents, SDKError, ValidationError, AgentResponse, PaymentError } from "../types/events";
19
24
  import { ErrorCode } from "../types/error-codes";
20
25
  import { TIMEOUTS } from "../constants";
21
26
  import {
@@ -24,6 +29,8 @@ import {
24
29
  AgentCommandContentSchema
25
30
  } from "../types/validation";
26
31
  import { waitForEvent } from "../utils/event-waiter";
32
+ import { PaymentClient, buildX402ResourceUrl } from "../payments/payment-client";
33
+ import type { SecurePrivateKey } from "../utils/secure-private-key";
27
34
 
28
35
  export interface SendMessageOptions {
29
36
  room: string;
@@ -39,6 +46,30 @@ export interface AgentCommand {
39
46
  room: string;
40
47
  }
41
48
 
49
+ /**
50
+ * Result of a quote request, containing pricing and agent details.
51
+ */
52
+ export interface QuoteResult {
53
+ taskId: string;
54
+ agentId: string;
55
+ agentName: string;
56
+ agentWallet: string;
57
+ command: string;
58
+ pricing: PricingInfo;
59
+ expiresAt: Date;
60
+ }
61
+
62
+ export interface MessageRouterConfig {
63
+ messageTimeout?: number;
64
+ responseFormat?: ResponseFormat;
65
+ autoApproveQuotes?: boolean;
66
+ maxPricePerRequest?: number;
67
+ quoteTimeout?: number;
68
+ wsUrl?: string;
69
+ paymentNetwork?: string;
70
+ paymentAsset?: string;
71
+ }
72
+
42
73
  export class MessageRouter extends EventEmitter<SDKEvents> {
43
74
  private readonly wsClient: WebSocketClient;
44
75
  private readonly webhookHandler: WebhookHandler;
@@ -47,15 +78,22 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
47
78
  private readonly messageTimeout: number;
48
79
  private readonly responseFormat: ResponseFormat;
49
80
 
81
+ // Quote-approve flow (v2.2.0)
82
+ private paymentClient: PaymentClient | null = null;
83
+ private readonly pendingQuotes: Map<string, QuoteResult> = new Map();
84
+ private readonly autoApproveQuotes: boolean;
85
+ private readonly maxPricePerRequest?: number;
86
+ private readonly quoteTimeout: number;
87
+ private readonly wsUrl: string;
88
+ private readonly paymentNetwork: string;
89
+ private readonly paymentAsset: string;
90
+
50
91
  constructor(
51
92
  wsClient: WebSocketClient,
52
93
  webhookHandler: WebhookHandler,
53
94
  responseFormatter: ResponseFormatter,
54
95
  logger: Logger,
55
- config: {
56
- messageTimeout?: number;
57
- responseFormat?: ResponseFormat;
58
- }
96
+ config: MessageRouterConfig
59
97
  ) {
60
98
  super();
61
99
  this.wsClient = wsClient;
@@ -65,9 +103,29 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
65
103
  this.messageTimeout = config.messageTimeout ?? TIMEOUTS.DEFAULT_MESSAGE_TIMEOUT;
66
104
  this.responseFormat = config.responseFormat ?? "humanized";
67
105
 
106
+ // Quote-approve config (v2.2.0)
107
+ this.autoApproveQuotes = config.autoApproveQuotes ?? true;
108
+ this.maxPricePerRequest = config.maxPricePerRequest;
109
+ this.quoteTimeout = config.quoteTimeout ?? 30000;
110
+ this.wsUrl = config.wsUrl ?? "";
111
+ this.paymentNetwork = config.paymentNetwork ?? "eip155:3338";
112
+ // USDC contract address on PEAQ network
113
+ this.paymentAsset = config.paymentAsset ?? "0xbbA60da06c2c5424f03f7434542280FCAd453d10";
114
+
68
115
  this.setupEventForwarding();
69
116
  }
70
117
 
118
+ /**
119
+ * Sets up the payment client for quote-approve flow.
120
+ * Must be called before using requestQuote/confirmQuote with paid tasks.
121
+ */
122
+ public setPaymentClient(secureKey: SecurePrivateKey, walletAddress: string): void {
123
+ this.paymentClient = new PaymentClient(secureKey, walletAddress, {
124
+ network: this.paymentNetwork,
125
+ asset: this.paymentAsset
126
+ });
127
+ }
128
+
71
129
  /**
72
130
  * Sends a message to agents via the coordinator.
73
131
  * The coordinator intelligently selects the most appropriate agent.
@@ -107,21 +165,31 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
107
165
  throw new SDKError("Not connected to Teneo network", ErrorCode.NOT_CONNECTED);
108
166
  }
109
167
 
110
- // Validate content
111
168
  const validatedContent = MessageContentSchema.parse(content);
112
-
113
169
  const room = options.room;
114
170
  if (!room) {
115
171
  throw new ValidationError("Room parameter is required");
116
172
  }
117
173
 
118
- // Use custom 'from' address if provided, otherwise use wallet address from auth state
174
+ // Use quote-approve flow with auto-approval (v2.2.0)
175
+ if (this.autoApproveQuotes) {
176
+ this.logger.debug("MessageRouter: Using quote-approve flow", {
177
+ content: validatedContent,
178
+ room
179
+ });
180
+ const quote = await this.requestQuote(validatedContent, room);
181
+ return await this.confirmQuote(quote.taskId, {
182
+ waitForResponse: options.waitForResponse,
183
+ timeout: options.timeout ?? this.messageTimeout
184
+ });
185
+ }
186
+
187
+ // Legacy flow (auto-approval disabled - user must manually confirm quotes)
119
188
  const authState = this.wsClient.getAuthState();
120
189
  const fromAddress = options.from ?? authState.walletAddress;
121
-
122
190
  const message = createUserMessage(validatedContent, room, fromAddress);
123
191
 
124
- this.logger.debug("MessageRouter: Sending message", {
192
+ this.logger.debug("MessageRouter: Sending message (legacy)", {
125
193
  content: validatedContent,
126
194
  room,
127
195
  from: fromAddress
@@ -164,7 +232,6 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
164
232
  throw new SDKError("Not connected to Teneo network", ErrorCode.NOT_CONNECTED);
165
233
  }
166
234
 
167
- // Validate command
168
235
  const validatedAgent = AgentIdSchema.parse(command.agent);
169
236
  const validatedCommand = AgentCommandContentSchema.parse(command.command);
170
237
 
@@ -173,15 +240,24 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
173
240
  throw new ValidationError("Room parameter is required");
174
241
  }
175
242
 
176
- // Get wallet address from auth state
243
+ const content = `@${validatedAgent} ${validatedCommand}`;
244
+
245
+ // Use quote-approve flow with auto-approval (v2.2.0)
246
+ if (this.autoApproveQuotes) {
247
+ this.logger.debug("MessageRouter: Using quote-approve flow", { content, room });
248
+ const quote = await this.requestQuote(content, room);
249
+ return await this.confirmQuote(quote.taskId, {
250
+ waitForResponse,
251
+ timeout: this.messageTimeout
252
+ });
253
+ }
254
+
255
+ // Legacy flow (auto-approval disabled - user must manually confirm quotes)
177
256
  const authState = this.wsClient.getAuthState();
178
257
  const walletAddress = authState.walletAddress;
179
-
180
- // Format as direct command
181
- const content = `@${validatedAgent} ${validatedCommand}`;
182
258
  const message = createUserMessage(content, room, walletAddress);
183
259
 
184
- this.logger.debug("MessageRouter: Sending direct command", {
260
+ this.logger.debug("MessageRouter: Sending direct command (legacy)", {
185
261
  agent: validatedAgent,
186
262
  command: validatedCommand,
187
263
  room,
@@ -204,6 +280,128 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
204
280
  }
205
281
  }
206
282
 
283
+ /**
284
+ * Requests a quote for a task without auto-approval.
285
+ * Returns the quote data for manual confirmation.
286
+ */
287
+ public async requestQuote(content: string, room: string): Promise<QuoteResult> {
288
+ if (!this.wsClient.isConnected) {
289
+ throw new SDKError("Not connected to Teneo network", ErrorCode.NOT_CONNECTED);
290
+ }
291
+
292
+ const message = createRequestTask(content, room);
293
+ this.logger.debug("MessageRouter: Requesting quote", { content, room });
294
+
295
+ await this.wsClient.sendMessage(message);
296
+
297
+ const quote = await waitForEvent<TaskQuoteMessage>(this.wsClient, "quote:received", {
298
+ timeout: this.quoteTimeout,
299
+ timeoutMessage: `Quote request timed out after ${this.quoteTimeout}ms`
300
+ });
301
+
302
+ const result: QuoteResult = {
303
+ taskId: quote.data.task_id,
304
+ agentId: quote.data.agent_id,
305
+ agentName: quote.data.agent_name,
306
+ agentWallet: quote.data.agent_wallet,
307
+ command: quote.data.command,
308
+ pricing: quote.data.pricing,
309
+ expiresAt: new Date(quote.data.expires_at)
310
+ };
311
+
312
+ this.pendingQuotes.set(result.taskId, result);
313
+ return result;
314
+ }
315
+
316
+ /**
317
+ * Confirms a quote and executes the task with payment.
318
+ * Can optionally wait for the task response.
319
+ */
320
+ public async confirmQuote(
321
+ taskId: string,
322
+ options?: { waitForResponse?: boolean; timeout?: number }
323
+ ): Promise<FormattedResponse | void> {
324
+ if (!this.wsClient.isConnected) {
325
+ throw new SDKError("Not connected to Teneo network", ErrorCode.NOT_CONNECTED);
326
+ }
327
+
328
+ const quote = this.pendingQuotes.get(taskId);
329
+ if (!quote) {
330
+ throw new ValidationError(`No pending quote found for task ${taskId}`);
331
+ }
332
+
333
+ if (new Date() > quote.expiresAt) {
334
+ this.pendingQuotes.delete(taskId);
335
+ throw new SDKError("Quote has expired", ErrorCode.QUOTE_EXPIRED);
336
+ }
337
+
338
+ // Check price limit
339
+ if (this.maxPricePerRequest !== undefined) {
340
+ const priceInUnits = quote.pricing.pricePerUnit * 1_000_000;
341
+ if (priceInUnits > this.maxPricePerRequest) {
342
+ this.emit("payment:blocked", {
343
+ agentId: quote.agentId,
344
+ agentPrice: priceInUnits,
345
+ maxPrice: this.maxPricePerRequest
346
+ });
347
+ throw new PaymentError(
348
+ `Quote price exceeds limit: ${priceInUnits} > ${this.maxPricePerRequest}`,
349
+ ErrorCode.PRICE_LIMIT_EXCEEDED,
350
+ { agentId: quote.agentId, agentPrice: priceInUnits, maxPrice: this.maxPricePerRequest }
351
+ );
352
+ }
353
+ }
354
+
355
+ let paymentHeader: string | undefined;
356
+
357
+ // Create payment header if payment client is configured and price > 0
358
+ if (this.paymentClient && quote.pricing.pricePerUnit > 0) {
359
+ try {
360
+ paymentHeader = await this.paymentClient.createPaymentHeader(
361
+ quote.pricing.pricePerUnit * 1_000_000,
362
+ quote.agentWallet,
363
+ buildX402ResourceUrl(this.wsUrl)
364
+ );
365
+ this.emit("payment:attached", {
366
+ agentId: quote.agentId,
367
+ amount: quote.pricing.pricePerUnit * 1_000_000,
368
+ command: quote.command
369
+ });
370
+ } catch (error) {
371
+ this.logger.error("Failed to create payment header for quote confirmation", error);
372
+ throw new PaymentError("Failed to create payment", ErrorCode.PAYMENT_FAILED, {
373
+ agentId: quote.agentId
374
+ });
375
+ }
376
+ }
377
+
378
+ const confirmMessage = createConfirmTask(taskId, paymentHeader);
379
+
380
+ this.logger.debug("MessageRouter: Confirming quote", { taskId });
381
+
382
+ await this.wsClient.sendMessage(confirmMessage);
383
+
384
+ // Delete quote only after successful send (enables retry on network failure)
385
+ this.pendingQuotes.delete(taskId);
386
+
387
+ if (options?.waitForResponse) {
388
+ const timeout = options.timeout ?? this.messageTimeout;
389
+ const response = await waitForEvent<AgentResponse>(this.wsClient, "agent:response", {
390
+ timeout,
391
+ filter: (r) => r.taskId === taskId,
392
+ timeoutMessage: `Task response timed out after ${timeout}ms (taskId: ${taskId})`
393
+ });
394
+ return response as FormattedResponse;
395
+ }
396
+ }
397
+
398
+ /**
399
+ * Gets a pending quote by task ID.
400
+ */
401
+ public getPendingQuote(taskId: string): QuoteResult | undefined {
402
+ return this.pendingQuotes.get(taskId);
403
+ }
404
+
207
405
  /**
208
406
  * Send message and wait for agent response
209
407
  * Uses event-waiter utility for clean Promise-based waiting with automatic cleanup