@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
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { describe, it, expect, beforeEach } from "vitest";
6
- import { BoundedQueue, QueueOverflowError, type OverflowStrategy } from "./bounded-queue";
6
+ import { BoundedQueue, QueueOverflowError } from "./bounded-queue";
7
7
 
8
8
  describe("BoundedQueue", () => {
9
9
  describe("constructor", () => {
@@ -181,10 +181,11 @@ export class BoundedQueue<T> {
181
181
  `Queue is full (max size: ${this.maxSize}). Cannot add more items.`
182
182
  );
183
183
 
184
- default:
184
+ default: {
185
185
  // TypeScript exhaustiveness check
186
186
  const _exhaustive: never = this.strategy;
187
187
  throw new Error(`Unknown overflow strategy: ${_exhaustive}`);
188
+ }
188
189
  }
189
190
  }
190
191
  }
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { describe, it, expect, beforeEach, vi } from "vitest";
6
- import { CircuitBreaker, CircuitBreakerError, type CircuitState } from "./circuit-breaker";
6
+ import { CircuitBreaker, CircuitBreakerError } from "./circuit-breaker";
7
7
 
8
8
  describe("CircuitBreaker", () => {
9
9
  describe("constructor", () => {
@@ -2,7 +2,7 @@
2
2
  * Tests for Deduplication Cache
3
3
  */
4
4
 
5
- import { describe, it, expect, beforeEach, vi } from "vitest";
5
+ import { describe, it, expect, beforeEach } from "vitest";
6
6
  import { DeduplicationCache } from "./deduplication-cache";
7
7
 
8
8
  describe("DeduplicationCache", () => {
@@ -123,7 +123,7 @@ describe("waitForEvent", () => {
123
123
  it("should timeout if no matching event arrives", async () => {
124
124
  const promise = waitForEvent(emitter, "filtered:event", {
125
125
  timeout: 1000,
126
- filter: (data: any) => data.id === 999
126
+ filter: (data: { id: number }) => data.id === 999
127
127
  });
128
128
 
129
129
  // Emit non-matching events
@@ -60,7 +60,7 @@ export interface WaitForEventOptions<T> {
60
60
  * });
61
61
  * ```
62
62
  */
63
- export async function waitForEvent<T = any>(
63
+ export async function waitForEvent<T = unknown>(
64
64
  emitter: EventEmitter,
65
65
  eventName: string,
66
66
  options: WaitForEventOptions<T>
@@ -129,7 +129,7 @@ export async function waitForEvent<T = any>(
129
129
  * ]);
130
130
  * ```
131
131
  */
132
- export async function waitForAnyEvent<T = any>(
132
+ export async function waitForAnyEvent<T = unknown>(
133
133
  waiters: Array<{
134
134
  emitter: EventEmitter;
135
135
  eventName: string;
@@ -157,7 +157,7 @@ export async function waitForAnyEvent<T = any>(
157
157
  * ]);
158
158
  * ```
159
159
  */
160
- export async function waitForAllEvents<T = any>(
160
+ export async function waitForAllEvents<T = unknown>(
161
161
  waiters: Array<{
162
162
  emitter: EventEmitter;
163
163
  eventName: string;
@@ -72,3 +72,10 @@ export {
72
72
  type RetryStrategy,
73
73
  type RetryStrategyType
74
74
  } from "./retry-policy";
75
+
76
+ export {
77
+ resolveAgentPricing,
78
+ parseCommandForPricing,
79
+ type ResolvedPricing,
80
+ type PriceResolutionOptions
81
+ } from "./pricing-resolver";
@@ -55,30 +55,30 @@ export function createPinoLogger(level: LogLevel, name?: string): Logger {
55
55
 
56
56
  // Adapt pino's API to match our Logger interface
57
57
  return {
58
- debug: (message: string, data?: any) => {
58
+ debug: (message: string, data?: unknown) => {
59
59
  if (data !== undefined) {
60
- pinoLogger.debug(data, message);
60
+ pinoLogger.debug(data as object, message);
61
61
  } else {
62
62
  pinoLogger.debug(message);
63
63
  }
64
64
  },
65
- info: (message: string, data?: any) => {
65
+ info: (message: string, data?: unknown) => {
66
66
  if (data !== undefined) {
67
- pinoLogger.info(data, message);
67
+ pinoLogger.info(data as object, message);
68
68
  } else {
69
69
  pinoLogger.info(message);
70
70
  }
71
71
  },
72
- warn: (message: string, data?: any) => {
72
+ warn: (message: string, data?: unknown) => {
73
73
  if (data !== undefined) {
74
- pinoLogger.warn(data, message);
74
+ pinoLogger.warn(data as object, message);
75
75
  } else {
76
76
  pinoLogger.warn(message);
77
77
  }
78
78
  },
79
- error: (message: string, data?: any) => {
79
+ error: (message: string, data?: unknown) => {
80
80
  if (data !== undefined) {
81
- pinoLogger.error(data, message);
81
+ pinoLogger.error(data as object, message);
82
82
  } else {
83
83
  pinoLogger.error(message);
84
84
  }
@@ -0,0 +1,128 @@
1
+ import { Agent, CommandPricing } from "../types";
2
+
3
+ const VALID_PRICE_TYPES = ["free", "per-query", "per-item", "time-based-task"] as const;
4
+ type PriceType = (typeof VALID_PRICE_TYPES)[number];
5
+
6
+ export interface ResolvedPricing {
7
+ pricePerUnit: number;
8
+ priceType: PriceType;
9
+ taskUnit?: string;
10
+ timeUnit?: "hour" | "day";
11
+ totalPrice: number;
12
+ itemCount?: number;
13
+ duration?: number;
14
+ }
15
+
16
+ export interface PriceResolutionOptions {
17
+ commandTrigger?: string;
18
+ itemCount?: number;
19
+ duration?: number;
20
+ }
21
+
22
+ function isValidPriceType(type: string): type is PriceType {
23
+ return VALID_PRICE_TYPES.includes(type as PriceType);
24
+ }
25
+
26
+ export function resolveAgentPricing(
27
+ agent: Agent,
28
+ options: PriceResolutionOptions = {}
29
+ ): ResolvedPricing | null {
30
+ const { commandTrigger, itemCount = 1, duration = 1 } = options;
31
+
32
+ // Validate itemCount and duration are positive
33
+ if (itemCount < 0 || duration < 0) {
34
+ return null;
35
+ }
36
+
37
+ let pricing: CommandPricing | undefined;
38
+
39
+ if (commandTrigger && agent.commands) {
40
+ const command = agent.commands.find(
41
+ (cmd) => cmd.trigger.toLowerCase() === commandTrigger.toLowerCase()
42
+ );
43
+ pricing = command?.pricing;
44
+ }
45
+
46
+ if (!pricing) {
47
+ return null;
48
+ }
49
+
50
+ const rawPriceType = pricing.priceType || "free";
51
+ const priceType: PriceType = isValidPriceType(rawPriceType) ? rawPriceType : "free";
52
+ const pricePerUnit = pricing.pricePerUnit || 0;
53
+
54
+ // Reject negative prices
55
+ if (pricePerUnit < 0) {
56
+ return null;
57
+ }
58
+
59
+ if (priceType === "free" || pricePerUnit === 0) {
60
+ return {
61
+ pricePerUnit: 0,
62
+ priceType: "free",
63
+ totalPrice: 0
64
+ };
65
+ }
66
+
67
+ let totalPrice: number;
68
+
69
+ switch (priceType) {
70
+ case "per-query":
71
+ totalPrice = pricePerUnit;
72
+ break;
73
+ case "per-item":
74
+ totalPrice = pricePerUnit * itemCount;
75
+ break;
76
+ case "time-based-task":
77
+ totalPrice = pricePerUnit * duration;
78
+ break;
79
+ default:
80
+ totalPrice = pricePerUnit;
81
+ }
82
+
83
+ return {
84
+ pricePerUnit,
85
+ priceType,
86
+ taskUnit: pricing.taskUnit,
87
+ timeUnit: pricing.timeUnit,
88
+ totalPrice,
89
+ itemCount: priceType === "per-item" ? itemCount : undefined,
90
+ duration: priceType === "time-based-task" ? duration : undefined
91
+ };
92
+ }
93
+
94
+ export function parseCommandForPricing(content: string): {
95
+ agentName?: string;
96
+ commandTrigger?: string;
97
+ itemCount?: number;
98
+ duration?: number;
99
+ } {
100
+ const directCommandMatch = content.match(/^@(\S+)\s+(.+)$/);
101
+ if (!directCommandMatch) {
102
+ return {};
103
+ }
104
+
105
+ const agentName = directCommandMatch[1];
106
+ const commandContent = directCommandMatch[2];
107
+
108
+ const parts = commandContent.trim().split(/\s+/);
109
+ const commandTrigger = parts[0];
110
+ const args = parts.slice(1);
111
+
112
+ let itemCount: number | undefined;
113
+ let duration: number | undefined;
114
+
115
+ for (const arg of args) {
116
+ const numMatch = arg.match(/^(\d+)$/);
117
+ if (numMatch) {
118
+ itemCount = parseInt(numMatch[1], 10);
119
+ }
120
+
121
+ const durationMatch = arg.match(/^(\d+)(h|d)$/i);
122
+ if (durationMatch) {
123
+ duration = parseInt(durationMatch[1], 10);
124
+ }
125
+ }
126
+
127
+ return { agentName, commandTrigger, itemCount, duration };
128
+ }
@@ -2,7 +2,7 @@
2
2
  * Tests for Token Bucket Rate Limiter
3
3
  */
4
4
 
5
- import { describe, it, expect, beforeEach, vi } from "vitest";
5
+ import { describe, it, expect } from "vitest";
6
6
  import { TokenBucketRateLimiter, RateLimitError } from "./rate-limiter";
7
7
 
8
8
  describe("TokenBucketRateLimiter", () => {
@@ -123,6 +123,7 @@ export class TokenBucketRateLimiter {
123
123
  public async consume(timeout?: number): Promise<void> {
124
124
  const startTime = Date.now();
125
125
 
126
+ // eslint-disable-next-line no-constant-condition
126
127
  while (true) {
127
128
  if (this.tryConsume()) {
128
129
  return;
@@ -2,10 +2,10 @@
2
2
  * Tests for Signature Verifier
3
3
  */
4
4
 
5
- import { describe, it, expect, beforeEach } from "vitest";
5
+ import { describe, it, expect } from "vitest";
6
6
  import { privateKeyToAccount } from "viem/accounts";
7
7
  import { SignatureVerifier } from "./signature-verifier";
8
- import { BaseMessage, createUserMessage } from "../types";
8
+ import { BaseMessage } from "../types";
9
9
 
10
10
  describe("SignatureVerifier", () => {
11
11
  // Test accounts
@@ -198,10 +198,11 @@ export class SignatureVerifier {
198
198
  * @returns Object containing signable fields
199
199
  */
200
200
  public getSignableContent(message: BaseMessage): object {
201
- const { signature, publicKey, id, ...signableContent } = message;
201
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
202
+ const { signature: _signature, publicKey: _publicKey, id: _id, ...signableContent } = message;
202
203
 
203
204
  // Include only defined fields for consistent hashing
204
- const filtered: Record<string, any> = {};
205
+ const filtered: Record<string, unknown> = {};
205
206
  for (const [key, value] of Object.entries(signableContent)) {
206
207
  if (value !== undefined) {
207
208
  filtered[key] = value;
@@ -0,0 +1,7 @@
1
+ # Copy this file to .env in the teneo-sdk root and fill in your values
2
+
3
+ # Required: Your wallet private key (with 0x prefix)
4
+ PRIVATE_KEY=0x...
5
+
6
+ # Optional: WebSocket URL (defaults to production)
7
+ # WS_URL=wss://backend.developer.chatroom.teneo-protocol.ai/ws
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Direct Agent Test - Tests direct @agent commands with payment
3
+ *
4
+ * Setup:
5
+ * Create a .env file in the teneo-sdk root with:
6
+ * PRIVATE_KEY=your_private_key_here
7
+ * WS_URL=wss://backend.developer.chatroom.teneo-protocol.ai/ws # optional
8
+ *
9
+ * Run:
10
+ * npx tsx tests/direct-agent-test.ts
11
+ */
12
+
13
+ import "dotenv/config";
14
+ import { TeneoSDK } from "../src/teneo-sdk";
15
+
16
+ // Configuration from environment variables (loaded from .env)
17
+ const WS_URL = process.env.WS_URL || "wss://backend.developer.chatroom.teneo-protocol.ai/ws";
18
+ const PRIVATE_KEY = process.env.PRIVATE_KEY;
19
+
20
+ if (!PRIVATE_KEY) {
21
+ console.error("❌ Missing PRIVATE_KEY");
22
+ console.error("");
23
+ console.error("Setup: Create a .env file in the teneo-sdk root with:");
24
+ console.error(" PRIVATE_KEY=your_private_key_here");
25
+ console.error("");
26
+ console.error("Then run:");
27
+ console.error(" npx tsx tests/direct-agent-test.ts");
28
+ process.exit(1);
29
+ }
30
+
31
+ // Type assertion after validation
32
+ const privateKey: string = PRIVATE_KEY;
33
+
34
+ let TEST_ROOM = ""; // Will be set after auth to use user's private room
35
+
36
+ async function testDirectAgentCommand() {
37
+ console.log("=== Direct Agent Command Test ===\n");
38
+ console.log("WebSocket URL:", WS_URL);
39
+
40
+ // Create SDK with quote-approve enabled
41
+ const config = TeneoSDK.builder()
42
+ .withWebSocketUrl(WS_URL)
43
+ .withAuthentication(privateKey)
44
+ .withPayments({
45
+ autoApprove: true,
46
+ maxPricePerRequest: 10_000_000 // Max 10 USDC
47
+ })
48
+ .withLogging("info")
49
+ .build();
50
+
51
+ const sdk = new TeneoSDK(config);
52
+
53
+ // Set up event listeners
54
+ sdk.on("connection:open", () => console.log("✓ Connected"));
55
+ sdk.on("auth:success", (state) => {
56
+ console.log("✓ Authenticated as:", state.walletAddress);
57
+ // Get user's first private room
58
+ if (state.privateRoomIds && state.privateRoomIds.length > 0) {
59
+ TEST_ROOM = state.privateRoomIds[0];
60
+ console.log("✓ Using room:", TEST_ROOM);
61
+ } else if (state.rooms && state.rooms.length > 0) {
62
+ TEST_ROOM = state.rooms[0];
63
+ console.log("✓ Using room:", TEST_ROOM);
64
+ }
65
+ });
66
+ sdk.on("quote:received", (quote) => {
67
+ console.log("\n📋 Quote Received:");
68
+ console.log(" Task ID:", quote.data.task_id);
69
+ console.log(" Agent:", quote.data.agent_name);
70
+ console.log(" Price:", quote.data.pricing.pricePerUnit, "USDC");
71
+ console.log(" Expires:", quote.data.expires_at);
72
+ });
73
+ sdk.on("payment:attached", (data) => {
74
+ console.log("\n💰 Payment Attached:");
75
+ console.log(" Agent:", data.agentId);
76
+ console.log(" Amount:", data.amount / 1_000_000, "USDC");
77
+ console.log(" Command:", data.command);
78
+ });
79
+ sdk.on("agent:response", (response) => {
80
+ console.log("\n📥 Agent Response:");
81
+ console.log(" Success:", response.success);
82
+ if (response.content) {
83
+ console.log(" Content:", response.content.substring(0, 200) + "...");
84
+ }
85
+ });
86
+ sdk.on("error", (error) => console.error("❌ Error:", error.message));
87
+
88
+ try {
89
+ // Connect
90
+ console.log("\nConnecting to", WS_URL);
91
+ await sdk.connect();
92
+ console.log("Connected!\n");
93
+
94
+ // Wait for auth to complete and room to be set
95
+ await sleep(500);
96
+
97
+ if (!TEST_ROOM) {
98
+ throw new Error("No room available - auth may have failed");
99
+ }
100
+
101
+ // Subscribe to test room
102
+ console.log("Subscribing to room:", TEST_ROOM);
103
+ try {
104
+ await sdk.subscribeToRoom(TEST_ROOM);
105
+ console.log("Subscribed!\n");
106
+ } catch {
107
+ console.log("Room subscription skipped (private room)\n");
108
+ }
109
+
110
+ // Wait a bit for connection to stabilize
111
+ await sleep(1000);
112
+
113
+ // Send direct agent command - bypasses coordinator, goes directly to agent
114
+ console.log("\n=== Sending Direct Agent Command ===");
115
+ console.log('Command: "@x-agent-enterprise-v2 user @elonmusk"\n');
116
+
117
+ const response = await sdk.sendMessage("@x-agent-enterprise-v2 user @elonmusk", {
118
+ room: TEST_ROOM,
119
+ waitForResponse: true,
120
+ timeout: 120000 // 2 minutes
121
+ });
122
+
123
+ if (response) {
124
+ console.log("\n=== Test Complete ===");
125
+ console.log("Response received successfully!");
126
+ console.log(
127
+ "Humanized:",
128
+ typeof response.humanized === "string"
129
+ ? response.humanized.substring(0, 500)
130
+ : JSON.stringify(response, null, 2).substring(0, 500)
131
+ );
132
+ }
133
+ } catch (error: unknown) {
134
+ const err = error as Error & { details?: unknown };
135
+ console.error("\n❌ Test failed:", err.message);
136
+ if (err.details) {
137
+ console.error("Details:", err.details);
138
+ }
139
+ } finally {
140
+ console.log("\nDisconnecting...");
141
+ sdk.destroy();
142
+ console.log("Done!");
143
+ }
144
+ }
145
+
146
+ function sleep(ms: number): Promise<void> {
147
+ return new Promise((resolve) => setTimeout(resolve, ms));
148
+ }
149
+
150
+ // Run the test
151
+ testDirectAgentCommand().catch(console.error);
@@ -49,6 +49,7 @@ const hasCredentials = !!(
49
49
  describe.skipIf(!hasCredentials)("Real Teneo Server Integration Test", () => {
50
50
  let sdk: TeneoSDK;
51
51
  let authState: AuthenticationState;
52
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
52
53
  let receivedAgents: Agent[] = [];
53
54
  let privateRoomId: string = "";
54
55
 
@@ -143,6 +144,7 @@ describe.skipIf(!hasCredentials)("Real Teneo Server Integration Test", () => {
143
144
 
144
145
  let challengeReceived = false;
145
146
  let authSuccessReceived = false;
147
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
146
148
  let usedCachedAuth = false;
147
149
 
148
150
  const challengePromise = new Promise<string | null>((resolve) => {