@teneo-protocol/sdk 2.0.0 → 2.2.1

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 (329) 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 +1 -0
  9. package/.github/workflows/push-to-main.yml +1 -1
  10. package/.github/workflows/top-issue.yml +102 -0
  11. package/CHANGELOG.md +69 -0
  12. package/CONCEPTS.md +747 -0
  13. package/README.md +178 -8
  14. package/dist/constants.js +8 -8
  15. package/dist/constants.js.map +1 -1
  16. package/dist/core/websocket-client.d.ts +15 -3
  17. package/dist/core/websocket-client.d.ts.map +1 -1
  18. package/dist/core/websocket-client.js +52 -13
  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.map +1 -1
  29. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +2 -5
  30. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -1
  31. package/dist/handlers/message-handlers/agent-selected-handler.js +2 -5
  32. package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -1
  33. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +783 -0
  34. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -1
  35. package/dist/handlers/message-handlers/agent-status-update-handler.js +2 -5
  36. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
  37. package/dist/handlers/message-handlers/agents-list-handler.js +2 -5
  38. package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -1
  39. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +439 -0
  40. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -0
  41. package/dist/handlers/message-handlers/all-agents-response-handler.js +36 -0
  42. package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -0
  43. package/dist/handlers/message-handlers/auth-error-handler.js +2 -5
  44. package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -1
  45. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  46. package/dist/handlers/message-handlers/auth-message-handler.js +6 -5
  47. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  48. package/dist/handlers/message-handlers/auth-required-handler.js +2 -5
  49. package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -1
  50. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  51. package/dist/handlers/message-handlers/auth-success-handler.js +6 -5
  52. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  53. package/dist/handlers/message-handlers/base-handler.d.ts +4 -4
  54. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
  55. package/dist/handlers/message-handlers/base-handler.js +3 -1
  56. package/dist/handlers/message-handlers/base-handler.js.map +1 -1
  57. package/dist/handlers/message-handlers/challenge-handler.js +3 -2
  58. package/dist/handlers/message-handlers/challenge-handler.js.map +1 -1
  59. package/dist/handlers/message-handlers/error-message-handler.js +2 -5
  60. package/dist/handlers/message-handlers/error-message-handler.js.map +1 -1
  61. package/dist/handlers/message-handlers/index.d.ts +6 -0
  62. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  63. package/dist/handlers/message-handlers/index.js +33 -1
  64. package/dist/handlers/message-handlers/index.js.map +1 -1
  65. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +783 -0
  66. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
  67. package/dist/handlers/message-handlers/list-available-agents-handler.js +2 -5
  68. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
  69. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +783 -0
  70. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -1
  71. package/dist/handlers/message-handlers/list-room-agents-handler.js +2 -5
  72. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
  73. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +4 -201
  74. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  75. package/dist/handlers/message-handlers/list-rooms-response-handler.js +5 -7
  76. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
  77. package/dist/handlers/message-handlers/ping-pong-handler.js +4 -10
  78. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
  79. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts +94 -0
  80. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -0
  81. package/dist/handlers/message-handlers/rate-limit-notification-handler.js +35 -0
  82. package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -0
  83. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  84. package/dist/handlers/message-handlers/regular-message-handler.js +4 -6
  85. package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
  86. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -1
  87. package/dist/handlers/message-handlers/room-operation-response-handler.js +2 -5
  88. package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -1
  89. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  90. package/dist/handlers/message-handlers/subscribe-response-handler.js +4 -6
  91. package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -1
  92. package/dist/handlers/message-handlers/task-quote-handler.d.ts +14 -0
  93. package/dist/handlers/message-handlers/task-quote-handler.d.ts.map +1 -0
  94. package/dist/handlers/message-handlers/task-quote-handler.js +29 -0
  95. package/dist/handlers/message-handlers/task-quote-handler.js.map +1 -0
  96. package/dist/handlers/message-handlers/task-response-handler.js +2 -5
  97. package/dist/handlers/message-handlers/task-response-handler.js.map +1 -1
  98. package/dist/handlers/message-handlers/types.d.ts +21 -9
  99. package/dist/handlers/message-handlers/types.d.ts.map +1 -1
  100. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  101. package/dist/handlers/message-handlers/unsubscribe-response-handler.js +4 -6
  102. package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -1
  103. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts +40 -0
  104. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts.map +1 -0
  105. package/dist/handlers/message-handlers/user-authenticated-handler.js +28 -0
  106. package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -0
  107. package/dist/handlers/message-handlers/user-count-handler.d.ts +49 -0
  108. package/dist/handlers/message-handlers/user-count-handler.d.ts.map +1 -0
  109. package/dist/handlers/message-handlers/user-count-handler.js +31 -0
  110. package/dist/handlers/message-handlers/user-count-handler.js.map +1 -0
  111. package/dist/handlers/webhook-handler.d.ts +1 -1
  112. package/dist/handlers/webhook-handler.d.ts.map +1 -1
  113. package/dist/handlers/webhook-handler.js +14 -5
  114. package/dist/handlers/webhook-handler.js.map +1 -1
  115. package/dist/index.d.ts +7 -2
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +20 -3
  118. package/dist/index.js.map +1 -1
  119. package/dist/managers/admin-manager.d.ts +116 -0
  120. package/dist/managers/admin-manager.d.ts.map +1 -0
  121. package/dist/managers/admin-manager.js +169 -0
  122. package/dist/managers/admin-manager.js.map +1 -0
  123. package/dist/managers/agent-registry.d.ts +52 -1
  124. package/dist/managers/agent-registry.d.ts.map +1 -1
  125. package/dist/managers/agent-registry.js +145 -6
  126. package/dist/managers/agent-registry.js.map +1 -1
  127. package/dist/managers/agent-room-manager.d.ts +1 -7
  128. package/dist/managers/agent-room-manager.d.ts.map +1 -1
  129. package/dist/managers/agent-room-manager.js +83 -36
  130. package/dist/managers/agent-room-manager.js.map +1 -1
  131. package/dist/managers/connection-manager.js +2 -0
  132. package/dist/managers/connection-manager.js.map +1 -1
  133. package/dist/managers/index.d.ts +2 -1
  134. package/dist/managers/index.d.ts.map +1 -1
  135. package/dist/managers/index.js +3 -1
  136. package/dist/managers/index.js.map +1 -1
  137. package/dist/managers/message-router.d.ts +56 -5
  138. package/dist/managers/message-router.d.ts.map +1 -1
  139. package/dist/managers/message-router.js +155 -8
  140. package/dist/managers/message-router.js.map +1 -1
  141. package/dist/managers/room-management-manager.d.ts.map +1 -1
  142. package/dist/managers/room-management-manager.js +9 -7
  143. package/dist/managers/room-management-manager.js.map +1 -1
  144. package/dist/managers/room-manager.d.ts +7 -5
  145. package/dist/managers/room-manager.d.ts.map +1 -1
  146. package/dist/managers/room-manager.js +14 -10
  147. package/dist/managers/room-manager.js.map +1 -1
  148. package/dist/payments/index.d.ts +5 -0
  149. package/dist/payments/index.d.ts.map +1 -0
  150. package/dist/payments/index.js +21 -0
  151. package/dist/payments/index.js.map +1 -0
  152. package/dist/payments/payment-client.d.ts +74 -0
  153. package/dist/payments/payment-client.d.ts.map +1 -0
  154. package/dist/payments/payment-client.js +207 -0
  155. package/dist/payments/payment-client.js.map +1 -0
  156. package/dist/teneo-sdk.d.ts +135 -21
  157. package/dist/teneo-sdk.d.ts.map +1 -1
  158. package/dist/teneo-sdk.js +268 -26
  159. package/dist/teneo-sdk.js.map +1 -1
  160. package/dist/types/categories.d.ts +22 -0
  161. package/dist/types/categories.d.ts.map +1 -0
  162. package/dist/types/categories.js +40 -0
  163. package/dist/types/categories.js.map +1 -0
  164. package/dist/types/config.d.ts +79 -8
  165. package/dist/types/config.d.ts.map +1 -1
  166. package/dist/types/config.js +62 -5
  167. package/dist/types/config.js.map +1 -1
  168. package/dist/types/error-codes.d.ts +8 -0
  169. package/dist/types/error-codes.d.ts.map +1 -1
  170. package/dist/types/error-codes.js +9 -0
  171. package/dist/types/error-codes.js.map +1 -1
  172. package/dist/types/events.d.ts +44 -0
  173. package/dist/types/events.d.ts.map +1 -1
  174. package/dist/types/events.js +19 -1
  175. package/dist/types/events.js.map +1 -1
  176. package/dist/types/index.d.ts +3 -2
  177. package/dist/types/index.d.ts.map +1 -1
  178. package/dist/types/index.js +33 -3
  179. package/dist/types/index.js.map +1 -1
  180. package/dist/types/messages.d.ts +11203 -407
  181. package/dist/types/messages.d.ts.map +1 -1
  182. package/dist/types/messages.js +251 -8
  183. package/dist/types/messages.js.map +1 -1
  184. package/dist/utils/bounded-queue.d.ts.map +1 -1
  185. package/dist/utils/bounded-queue.js +5 -2
  186. package/dist/utils/bounded-queue.js.map +1 -1
  187. package/dist/utils/circuit-breaker.js +11 -4
  188. package/dist/utils/circuit-breaker.js.map +1 -1
  189. package/dist/utils/deduplication-cache.js +3 -1
  190. package/dist/utils/deduplication-cache.js.map +1 -1
  191. package/dist/utils/event-waiter.d.ts +3 -3
  192. package/dist/utils/event-waiter.d.ts.map +1 -1
  193. package/dist/utils/index.d.ts +1 -0
  194. package/dist/utils/index.d.ts.map +1 -1
  195. package/dist/utils/index.js +4 -1
  196. package/dist/utils/index.js.map +1 -1
  197. package/dist/utils/logger.js.map +1 -1
  198. package/dist/utils/pricing-resolver.d.ts +26 -0
  199. package/dist/utils/pricing-resolver.d.ts.map +1 -0
  200. package/dist/utils/pricing-resolver.js +85 -0
  201. package/dist/utils/pricing-resolver.js.map +1 -0
  202. package/dist/utils/rate-limiter.d.ts.map +1 -1
  203. package/dist/utils/rate-limiter.js +6 -0
  204. package/dist/utils/rate-limiter.js.map +1 -1
  205. package/dist/utils/retry-policy.js +1 -0
  206. package/dist/utils/retry-policy.js.map +1 -1
  207. package/dist/utils/secure-private-key.js +3 -1
  208. package/dist/utils/secure-private-key.js.map +1 -1
  209. package/dist/utils/signature-verifier.d.ts.map +1 -1
  210. package/dist/utils/signature-verifier.js +3 -1
  211. package/dist/utils/signature-verifier.js.map +1 -1
  212. package/examples/.env.example +1 -1
  213. package/examples/agent-room-management-example.ts +10 -9
  214. package/examples/basic-usage.ts +3 -4
  215. package/examples/claude-agent-x-follower/.env.example +1 -1
  216. package/examples/claude-agent-x-follower/QUICKSTART.md +2 -2
  217. package/examples/claude-agent-x-follower/README.md +2 -2
  218. package/examples/claude-agent-x-follower/index.ts +120 -96
  219. package/examples/n8n-teneo/.env.example +1 -1
  220. package/examples/n8n-teneo/README.md +1 -1
  221. package/examples/n8n-teneo/index.ts +54 -44
  222. package/examples/nestjs-dashboard/.env.example +11 -0
  223. package/examples/nestjs-dashboard/README.md +297 -0
  224. package/examples/nestjs-dashboard/nest-cli.json +10 -0
  225. package/examples/nestjs-dashboard/package.json +44 -0
  226. package/examples/nestjs-dashboard/pnpm-lock.yaml +3079 -0
  227. package/examples/nestjs-dashboard/src/app.controller.ts +24 -0
  228. package/examples/nestjs-dashboard/src/app.module.ts +15 -0
  229. package/examples/nestjs-dashboard/src/main.ts +32 -0
  230. package/examples/nestjs-dashboard/src/public/dashboard.html +1144 -0
  231. package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +54 -0
  232. package/examples/nestjs-dashboard/src/teneo/events.controller.ts +65 -0
  233. package/examples/nestjs-dashboard/src/teneo/messages.controller.ts +47 -0
  234. package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +258 -0
  235. package/examples/nestjs-dashboard/src/teneo/teneo.module.ts +13 -0
  236. package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +484 -0
  237. package/examples/nestjs-dashboard/tsconfig.json +22 -0
  238. package/examples/openai-teneo/.env.example +1 -1
  239. package/examples/openai-teneo/README.md +2 -2
  240. package/examples/openai-teneo/index.ts +82 -71
  241. package/examples/production-dashboard/.env.example +1 -1
  242. package/examples/production-dashboard/README.md +1 -1
  243. package/examples/production-dashboard/server.ts +2 -2
  244. package/examples/room-management-example.ts +5 -8
  245. package/examples/usage/.env.example +1 -1
  246. package/examples/usage/01-connect.ts +3 -4
  247. package/examples/usage/02-list-agents.ts +2 -3
  248. package/examples/usage/03-pick-agent.ts +2 -3
  249. package/examples/usage/04-find-by-capability.ts +2 -3
  250. package/examples/usage/05-webhook-example.ts +2 -3
  251. package/examples/usage/06-simple-api-server.ts +2 -3
  252. package/examples/usage/07-event-listener.ts +2 -3
  253. package/examples/webhook-integration.ts +1 -1
  254. package/examples/x-influencer-battle-server.ts +2 -2
  255. package/package.json +4 -1
  256. package/src/core/websocket-client.test.ts +8 -3
  257. package/src/core/websocket-client.ts +36 -6
  258. package/src/formatters/response-formatter.test.ts +2 -0
  259. package/src/formatters/response-formatter.ts +3 -3
  260. package/src/handlers/message-handlers/agent-details-response-handler.ts +42 -0
  261. package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +2 -8
  262. package/src/handlers/message-handlers/agent-status-update-handler.ts +3 -9
  263. package/src/handlers/message-handlers/all-agents-response-handler.ts +39 -0
  264. package/src/handlers/message-handlers/auth-message-handler.ts +5 -0
  265. package/src/handlers/message-handlers/auth-success-handler.ts +6 -1
  266. package/src/handlers/message-handlers/base-handler.ts +20 -7
  267. package/src/handlers/message-handlers/index.ts +34 -0
  268. package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -5
  269. package/src/handlers/message-handlers/list-rooms-response-handler.ts +6 -4
  270. package/src/handlers/message-handlers/rate-limit-notification-handler.ts +45 -0
  271. package/src/handlers/message-handlers/regular-message-handler.ts +3 -2
  272. package/src/handlers/message-handlers/room-operation-response-handler.ts +3 -6
  273. package/src/handlers/message-handlers/subscribe-response-handler.ts +12 -2
  274. package/src/handlers/message-handlers/task-quote-handler.ts +31 -0
  275. package/src/handlers/message-handlers/types.ts +37 -9
  276. package/src/handlers/message-handlers/unsubscribe-response-handler.ts +12 -2
  277. package/src/handlers/message-handlers/user-authenticated-handler.ts +31 -0
  278. package/src/handlers/message-handlers/user-count-handler.ts +34 -0
  279. package/src/handlers/webhook-handler.test.ts +3 -2
  280. package/src/handlers/webhook-handler.ts +13 -7
  281. package/src/index.ts +22 -1
  282. package/src/managers/admin-manager.ts +249 -0
  283. package/src/managers/agent-registry.test.ts +2 -1
  284. package/src/managers/agent-registry.ts +170 -2
  285. package/src/managers/agent-room-manager.ts +98 -42
  286. package/src/managers/index.ts +13 -1
  287. package/src/managers/message-router.ts +215 -17
  288. package/src/managers/room-management-manager.ts +4 -7
  289. package/src/managers/room-manager.ts +11 -15
  290. package/src/payments/index.ts +22 -0
  291. package/src/payments/payment-client.ts +240 -0
  292. package/src/teneo-sdk.ts +302 -27
  293. package/src/types/categories.ts +45 -0
  294. package/src/types/config.ts +70 -2
  295. package/src/types/error-codes.ts +10 -0
  296. package/src/types/events.test.ts +1 -0
  297. package/src/types/events.ts +43 -0
  298. package/src/types/index.ts +56 -0
  299. package/src/types/messages.test.ts +2 -1
  300. package/src/types/messages.ts +309 -6
  301. package/src/utils/bounded-queue.test.ts +1 -1
  302. package/src/utils/bounded-queue.ts +2 -1
  303. package/src/utils/circuit-breaker.test.ts +1 -1
  304. package/src/utils/deduplication-cache.test.ts +1 -1
  305. package/src/utils/event-waiter.test.ts +1 -1
  306. package/src/utils/event-waiter.ts +3 -3
  307. package/src/utils/index.ts +7 -0
  308. package/src/utils/logger.ts +8 -8
  309. package/src/utils/pricing-resolver.ts +128 -0
  310. package/src/utils/rate-limiter.test.ts +1 -1
  311. package/src/utils/rate-limiter.ts +1 -0
  312. package/src/utils/signature-verifier.test.ts +2 -2
  313. package/src/utils/signature-verifier.ts +3 -2
  314. package/tests/.env.example +7 -0
  315. package/tests/direct-agent-test.ts +151 -0
  316. package/tests/integration/real-server.test.ts +2 -0
  317. package/tests/integration/room-management.test.ts +10 -8
  318. package/tests/integration/websocket.test.ts +4 -1
  319. package/tests/payment-flow-test.ts +147 -0
  320. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +17 -29
  321. package/tests/unit/handlers/agent-status-update-handler.test.ts +2 -6
  322. package/tests/unit/handlers/auth-success-handler-rooms.test.ts +1 -3
  323. package/tests/unit/handlers/list-available-agents-handler.test.ts +4 -12
  324. package/tests/unit/handlers/list-room-agents-handler.test.ts +2 -6
  325. package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -36
  326. package/tests/unit/managers/agent-room-manager.test.ts +9 -16
  327. package/tests/unit/managers/room-management-manager.test.ts +21 -39
  328. package/tsconfig.json +2 -2
  329. 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) => {
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from "vitest";
7
- import WebSocket, { WebSocketServer } from "ws";
7
+ import { WebSocketServer } from "ws";
8
8
  import { TeneoSDK } from "../../src";
9
9
  import { SDKConfigBuilder } from "../../src/types";
10
10
  import { privateKeyToAccount } from "viem/accounts";
@@ -69,7 +69,7 @@ describe.skip("Room Management Integration Tests", () => {
69
69
  );
70
70
  break;
71
71
 
72
- case "create_room":
72
+ case "create_room": {
73
73
  // Create new room
74
74
  const newRoomId = `room-${roomCounter++}`;
75
75
  const newRoom: RoomInfo = {
@@ -96,8 +96,9 @@ describe.skip("Room Management Integration Tests", () => {
96
96
  })
97
97
  );
98
98
  break;
99
+ }
99
100
 
100
- case "update_room":
101
+ case "update_room": {
101
102
  // Update existing room
102
103
  const roomId = message.room_id;
103
104
  const existingRoom = rooms.get(roomId);
@@ -137,8 +138,9 @@ describe.skip("Room Management Integration Tests", () => {
137
138
  })
138
139
  );
139
140
  break;
141
+ }
140
142
 
141
- case "delete_room":
143
+ case "delete_room": {
142
144
  // Delete room
143
145
  const deleteRoomId = message.room_id;
144
146
  const roomToDelete = rooms.get(deleteRoomId);
@@ -171,6 +173,7 @@ describe.skip("Room Management Integration Tests", () => {
171
173
  })
172
174
  );
173
175
  break;
176
+ }
174
177
 
175
178
  case "ping":
176
179
  ws.send(JSON.stringify({ type: "pong" }));
@@ -245,7 +248,6 @@ describe.skip("Room Management Integration Tests", () => {
245
248
  expect(ownedRooms[0].id).toBe(room.id);
246
249
  });
247
250
 
248
-
249
251
  it("should emit room:created event", async () => {
250
252
  const roomOptions = {
251
253
  name: "Event Test Room"
@@ -267,9 +269,7 @@ describe.skip("Room Management Integration Tests", () => {
267
269
  it("should validate room name", async () => {
268
270
  await expect(sdk.createRoom({ name: "" })).rejects.toThrow("Room name cannot be empty");
269
271
 
270
- await expect(sdk.createRoom({ name: "a".repeat(101) })).rejects.toThrow(
271
- "Room name too long"
272
- );
272
+ await expect(sdk.createRoom({ name: "a".repeat(101) })).rejects.toThrow("Room name too long");
273
273
  });
274
274
 
275
275
  it("should validate room description", async () => {
@@ -470,9 +470,11 @@ describe.skip("Room Management Integration Tests", () => {
470
470
 
471
471
  describe("Multiple Rooms", () => {
472
472
  it("should handle creating multiple rooms", async () => {
473
+ /* eslint-disable @typescript-eslint/no-unused-vars */
473
474
  const room1 = await sdk.createRoom({ name: "Room 1" });
474
475
  const room2 = await sdk.createRoom({ name: "Room 2" });
475
476
  const room3 = await sdk.createRoom({ name: "Room 3" });
477
+ /* eslint-enable @typescript-eslint/no-unused-vars */
476
478
 
477
479
  expect(sdk.getOwnedRoomCount()).toBe(3);
478
480
 
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from "vitest";
2
- import WebSocket, { WebSocketServer } from "ws";
2
+ import { WebSocketServer } from "ws";
3
3
  import { TeneoSDK } from "../../src";
4
4
  import { SDKConfigBuilder } from "../../src/types";
5
5
  import { privateKeyToAccount } from "viem/accounts";
@@ -10,6 +10,7 @@ describe("WebSocket Integration Tests", () => {
10
10
  let sdk: TeneoSDK;
11
11
  let serverPort: number;
12
12
  let privateKey: string;
13
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
13
14
  let walletAddress: string;
14
15
 
15
16
  // Mock server to simulate Teneo WebSocket server
@@ -150,6 +151,7 @@ describe("WebSocket Integration Tests", () => {
150
151
  .withAuthentication(privateKey)
151
152
  .withReconnection(false) // Disable for tests
152
153
  .withAutoJoinRooms(["test-room"]) // Auto-join test room
154
+ .withPayments({ autoApprove: false }) // Use legacy flow for mock server
153
155
  .build();
154
156
 
155
157
  sdk = new TeneoSDK(config);
@@ -290,6 +292,7 @@ describe("WebSocket Integration Tests", () => {
290
292
  .withAuthentication(privateKey)
291
293
  .withWebhook("http://localhost:3001/webhook")
292
294
  .withReconnection(false)
295
+ .withPayments({ autoApprove: false }) // Use legacy flow for mock server
293
296
  .build()
294
297
  );
295
298