@teneo-protocol/sdk 2.0.0 → 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 (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 +2 -199
  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 +4 -6
  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 +6 -1
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +19 -2
  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 +11219 -423
  181. package/dist/types/messages.d.ts.map +1 -1
  182. package/dist/types/messages.js +249 -7
  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 +4 -2
  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 +21 -0
  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 +307 -5
  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
@@ -7,6 +7,24 @@ import { z } from "zod";
7
7
  import { BaseMessage, MessageType, Logger, WebhookEventType } from "../../types";
8
8
  import { FormattedResponse } from "../../formatters/response-formatter";
9
9
  import { PrivateKeyAccount } from "viem/accounts";
10
+ import type { RoomManager } from "../../managers/room-manager";
11
+ import type { RoomManagementManager } from "../../managers/room-management-manager";
12
+ import type { AgentRoomManager } from "../../managers/agent-room-manager";
13
+ import type { AdminManager } from "../../managers/admin-manager";
14
+ import type { AgentRegistry } from "../../managers/agent-registry";
15
+
16
+ // Re-export connection and auth state types from main config
17
+ // These types define the shape of state used by handlers
18
+ import type {
19
+ ConnectionState as ConfigConnectionState,
20
+ AuthenticationState as ConfigAuthenticationState
21
+ } from "../../types/config";
22
+
23
+ /** Connection state for the WebSocket client (re-exported from config) */
24
+ export type ConnectionState = ConfigConnectionState;
25
+
26
+ /** Authentication state (re-exported from config) */
27
+ export type AuthState = ConfigAuthenticationState;
10
28
 
11
29
  /**
12
30
  * Context provided to message handlers
@@ -14,10 +32,14 @@ import { PrivateKeyAccount } from "viem/accounts";
14
32
  */
15
33
  export interface HandlerContext {
16
34
  // Event emission
17
- emit: (event: string, ...args: any[]) => void;
35
+ emit: (event: string, ...args: unknown[]) => void;
18
36
 
19
37
  // Webhook delivery
20
- sendWebhook: (type: WebhookEventType, data: any, metadata?: any) => Promise<void>;
38
+ sendWebhook: (
39
+ type: WebhookEventType,
40
+ data: Record<string, unknown>,
41
+ metadata?: Record<string, unknown>
42
+ ) => Promise<void>;
21
43
 
22
44
  // Response formatting (optional)
23
45
  formatResponse?: (message: BaseMessage) => FormattedResponse;
@@ -26,19 +48,25 @@ export interface HandlerContext {
26
48
  logger: Logger;
27
49
 
28
50
  // State access
29
- getConnectionState: () => any;
30
- getAuthState: () => any;
31
- updateConnectionState: (update: any) => void;
32
- updateAuthState: (update: any) => void;
51
+ getConnectionState: () => ConnectionState;
52
+ getAuthState: () => AuthState;
53
+ updateConnectionState: (update: Partial<ConnectionState>) => void;
54
+ updateAuthState: (update: Partial<AuthState>) => void;
33
55
 
34
56
  // Room manager for subscription updates (optional)
35
- roomManager?: any;
57
+ roomManager?: RoomManager;
36
58
 
37
59
  // Room management manager for CRUD operations (v2.0.0, optional)
38
- roomManagementManager?: any;
60
+ roomManagementManager?: RoomManagementManager;
39
61
 
40
62
  // Agent room manager for agent-room operations (v2.0.0, optional)
41
- agentRoomManager?: any;
63
+ agentRoomManager?: AgentRoomManager;
64
+
65
+ // Admin manager for admin-only features (optional)
66
+ adminManager?: AdminManager;
67
+
68
+ // Agent registry for agent details lookups (optional)
69
+ agentRegistry?: AgentRegistry;
42
70
 
43
71
  // Account for signing (optional, for auth handlers)
44
72
  account?: PrivateKeyAccount;
@@ -3,7 +3,8 @@
3
3
  * Processes room unsubscription confirmations
4
4
  */
5
5
 
6
- import { UnsubscribeResponse, UnsubscribeResponseSchema } from "../../types";
6
+ import { UnsubscribeResponse, UnsubscribeResponseSchema, ErrorCode } from "../../types";
7
+ import { SDKError } from "../../types/events";
7
8
  import { BaseMessageHandler } from "./base-handler";
8
9
  import { HandlerContext } from "./types";
9
10
 
@@ -41,7 +42,16 @@ export class UnsubscribeResponseHandler extends BaseMessageHandler<UnsubscribeRe
41
42
  });
42
43
 
43
44
  // Emit error event
44
- this.emit(context, "error", new Error(`Unsubscription failed: ${message.data.message}`));
45
+ this.emit(
46
+ context,
47
+ "error",
48
+ new SDKError(
49
+ `Unsubscription failed: ${message.data.message}`,
50
+ ErrorCode.OPERATION_FAILED,
51
+ { roomId: message.data.room_id },
52
+ true
53
+ )
54
+ );
45
55
  }
46
56
  }
47
57
  }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Handler for user_authenticated messages
3
+ * Processes user authentication broadcasts for presence tracking
4
+ */
5
+
6
+ import { UserAuthenticatedMessage, UserAuthenticatedMessageSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+
10
+ export class UserAuthenticatedHandler extends BaseMessageHandler<UserAuthenticatedMessage> {
11
+ readonly type = "user_authenticated" as const;
12
+ readonly schema = UserAuthenticatedMessageSchema;
13
+
14
+ protected handleValidated(message: UserAuthenticatedMessage, context: HandlerContext): void {
15
+ const { wallet } = message.data;
16
+
17
+ context.logger.debug("Handling user_authenticated", {
18
+ wallet
19
+ });
20
+
21
+ context.logger.info("User authenticated broadcast received", {
22
+ wallet
23
+ });
24
+
25
+ // Emit presence event
26
+ this.emit(context, "user:authenticated", { wallet });
27
+
28
+ // Send webhook
29
+ this.sendWebhook(context, "user_authenticated", message.data);
30
+ }
31
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Handler for user_count messages (Admin only)
3
+ * Processes user count broadcasts to admin users
4
+ */
5
+
6
+ import { UserCountMessage, UserCountMessageSchema } from "../../types";
7
+ import { BaseMessageHandler } from "./base-handler";
8
+ import { HandlerContext } from "./types";
9
+
10
+ export class UserCountHandler extends BaseMessageHandler<UserCountMessage> {
11
+ readonly type = "user_count" as const;
12
+ readonly schema = UserCountMessageSchema;
13
+
14
+ protected handleValidated(message: UserCountMessage, context: HandlerContext): void {
15
+ const { count, timestamp } = message.data;
16
+
17
+ context.logger.debug("Handling user_count", {
18
+ count,
19
+ timestamp
20
+ });
21
+
22
+ // Delegate to admin manager if available
23
+ const adminManager = context.adminManager;
24
+ if (adminManager && typeof adminManager.handleUserCount === "function") {
25
+ adminManager.handleUserCount(message.data);
26
+ }
27
+
28
+ // Emit admin event
29
+ this.emit(context, "admin:user_count", { count, timestamp });
30
+
31
+ // Send webhook
32
+ this.sendWebhook(context, "user_count", message.data);
33
+ }
34
+ }
@@ -15,11 +15,12 @@ describe("WebhookHandler", () => {
15
15
  let handler: WebhookHandler;
16
16
  let mockConfig: SDKConfig;
17
17
  let mockLogger: Logger;
18
- let mockFetch: any;
18
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
+ let mockFetch: ReturnType<typeof vi.fn>;
19
20
 
20
21
  beforeEach(() => {
21
22
  vi.useFakeTimers();
22
- mockFetch = fetch as any;
23
+ mockFetch = fetch as unknown as ReturnType<typeof vi.fn>;
23
24
  mockFetch.mockClear();
24
25
 
25
26
  mockConfig = {
@@ -166,7 +166,11 @@ export class WebhookHandler extends EventEmitter<SDKEvents> {
166
166
  * });
167
167
  * ```
168
168
  */
169
- public async sendWebhook(eventType: WebhookEventType, data: any, metadata?: any): Promise<void> {
169
+ public async sendWebhook(
170
+ eventType: WebhookEventType,
171
+ data: Record<string, unknown>,
172
+ metadata?: Record<string, unknown>
173
+ ): Promise<void> {
170
174
  if (!this.webhookConfig || this.isDestroyed) {
171
175
  return;
172
176
  }
@@ -388,7 +392,7 @@ export class WebhookHandler extends EventEmitter<SDKEvents> {
388
392
  ...this.webhookConfig.headers
389
393
  },
390
394
  body: JSON.stringify(item.payload),
391
- signal: controller.signal as any
395
+ signal: controller.signal as AbortSignal
392
396
  };
393
397
 
394
398
  const response = await fetch(this.webhookConfig.url, options);
@@ -408,13 +412,14 @@ export class WebhookHandler extends EventEmitter<SDKEvents> {
408
412
 
409
413
  this.emit("webhook:sent", item.payload, this.webhookConfig.url);
410
414
  this.emit("webhook:success", responseData, this.webhookConfig.url);
411
- } catch (error: any) {
412
- if (error.name === "AbortError") {
415
+ } catch (error: unknown) {
416
+ const err = error as Error;
417
+ if (err.name === "AbortError") {
413
418
  throw new WebhookError("Webhook timeout", {
414
419
  timeout: this.webhookConfig.timeout
415
420
  });
416
421
  }
417
- throw new WebhookError(`Webhook delivery failed: ${error.message}`, error);
422
+ throw new WebhookError(`Webhook delivery failed: ${err.message}`, error);
418
423
  } finally {
419
424
  clearTimeout(timeout);
420
425
  }
@@ -434,8 +439,9 @@ export class WebhookHandler extends EventEmitter<SDKEvents> {
434
439
  // Use comprehensive SSRF validator
435
440
  // allowInsecureWebhooks controls whether localhost/HTTP is allowed
436
441
  validateSSRF(url, this.config.allowInsecureWebhooks ?? false);
437
- } catch (error: any) {
438
- throw new WebhookError(`Webhook URL validation failed: ${error.message}`, { url });
442
+ } catch (error: unknown) {
443
+ const err = error as Error;
444
+ throw new WebhookError(`Webhook URL validation failed: ${err.message}`, { url });
439
445
  }
440
446
  }
441
447
 
package/src/index.ts CHANGED
@@ -202,6 +202,7 @@ export {
202
202
  RateLimitError,
203
203
  SignatureVerificationError,
204
204
  ConfigurationError,
205
+ PaymentError,
205
206
 
206
207
  // Validation helpers
207
208
  validateEventData,
@@ -232,6 +233,26 @@ export {
232
233
  */
233
234
  export { SecurePrivateKey } from "./utils/secure-private-key";
234
235
 
236
+ /**
237
+ * Payment utilities for x402 payment signing
238
+ * Enables SDK users to make payments directly using private keys
239
+ */
240
+ export {
241
+ PaymentClient,
242
+ type PaymentClientConfig,
243
+ PEAQ_CHAIN_ID,
244
+ USDC_CONTRACT,
245
+ DEFAULT_PAY_TO_ADDRESS,
246
+ DEFAULT_RPC_URL,
247
+ USDC_DECIMALS,
248
+ X402_VERSION,
249
+ DEFAULT_PAYMENT_TIMEOUT_SECONDS,
250
+ buildX402ResourceUrl,
251
+ usdcToUnits,
252
+ unitsToUsdc,
253
+ type SupportedChain
254
+ } from "./payments";
255
+
235
256
  /**
236
257
  * SDK version string
237
258
  */
@@ -0,0 +1,249 @@
1
+ /**
2
+ * AdminManager - Manages admin-only features
3
+ * Provides access to admin APIs like listing all agents, user counts, etc.
4
+ * Only available to users with admin privileges.
5
+ */
6
+
7
+ import { EventEmitter } from "eventemitter3";
8
+ import { WebSocketClient } from "../core/websocket-client";
9
+ import { Logger, AdminAgentInfo, UserCountData } from "../types";
10
+ import { SDKError } from "../types/events";
11
+ import { ErrorCode } from "../types/error-codes";
12
+
13
+ /**
14
+ * Events emitted by the AdminManager
15
+ */
16
+ export interface AdminManagerEvents {
17
+ /** Emitted when user count is updated (broadcast to admins) */
18
+ user_count: (data: UserCountData) => void;
19
+ /** Emitted when admin status changes */
20
+ status_changed: (isAdmin: boolean) => void;
21
+ }
22
+
23
+ /**
24
+ * Options for listing all agents (admin only)
25
+ */
26
+ export interface ListAllAgentsOptions {
27
+ /** Filter string for agent search */
28
+ filter?: string;
29
+ /** Pagination offset */
30
+ offset?: number;
31
+ /** Number of agents to return (default: 50) */
32
+ limit?: number;
33
+ }
34
+
35
+ /**
36
+ * Response from listing all agents
37
+ */
38
+ export interface AllAgentsResult {
39
+ /** List of agents */
40
+ agents: AdminAgentInfo[];
41
+ /** Total number of agents matching filter */
42
+ total: number;
43
+ /** Current offset */
44
+ offset: number;
45
+ /** Page size */
46
+ limit: number;
47
+ /** Whether there are more agents to load */
48
+ hasMore: boolean;
49
+ /** Applied filter (if any) */
50
+ filter?: string;
51
+ }
52
+
53
+ /**
54
+ * Pending request waiting for response
55
+ */
56
+ interface PendingRequest<T> {
57
+ resolve: (result: T) => void;
58
+ reject: (error: Error) => void;
59
+ timeout: ReturnType<typeof setTimeout>;
60
+ }
61
+
62
+ export class AdminManager extends EventEmitter<AdminManagerEvents> {
63
+ private readonly wsClient: WebSocketClient;
64
+ private readonly logger: Logger;
65
+ private _isAdmin: boolean = false;
66
+ private readonly pendingListRequests = new Map<string, PendingRequest<AllAgentsResult>>();
67
+ private lastUserCount: UserCountData | null = null;
68
+
69
+ /** Default timeout for requests (30 seconds) */
70
+ private readonly requestTimeout = 30000;
71
+
72
+ constructor(wsClient: WebSocketClient, logger: Logger) {
73
+ super();
74
+ this.wsClient = wsClient;
75
+ this.logger = logger;
76
+ }
77
+
78
+ /**
79
+ * Whether the current user has admin privileges.
80
+ */
81
+ public get isAdmin(): boolean {
82
+ return this._isAdmin;
83
+ }
84
+
85
+ /**
86
+ * Sets the admin status. Called internally after authentication.
87
+ * @internal
88
+ */
89
+ public setAdminStatus(isAdmin: boolean): void {
90
+ const changed = this._isAdmin !== isAdmin;
91
+ this._isAdmin = isAdmin;
92
+
93
+ if (changed) {
94
+ this.logger.info("AdminManager: Admin status changed", { isAdmin });
95
+ this.emit("status_changed", isAdmin);
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Lists all agents in the network (admin only).
101
+ * Returns paginated list of agents with full admin information.
102
+ *
103
+ * @param options - Pagination and filter options
104
+ * @returns Promise that resolves with agents list
105
+ * @throws {SDKError} If not connected or not an admin
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * if (sdk.admin?.isAdmin) {
110
+ * const result = await sdk.admin.listAllAgents({ limit: 20 });
111
+ * console.log(`Found ${result.total} agents`);
112
+ * result.agents.forEach(agent => {
113
+ * console.log(`${agent.agent_name}: verified=${agent.is_verified}, banned=${agent.is_banned}`);
114
+ * });
115
+ * }
116
+ * ```
117
+ */
118
+ public async listAllAgents(options: ListAllAgentsOptions = {}): Promise<AllAgentsResult> {
119
+ if (!this.wsClient.isConnected) {
120
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
121
+ }
122
+
123
+ if (!this._isAdmin) {
124
+ throw new SDKError("Admin privileges required", ErrorCode.AUTH_ERROR);
125
+ }
126
+
127
+ const { filter, offset = 0, limit = 50 } = options;
128
+
129
+ this.logger.info("AdminManager: Listing all agents", { filter, offset, limit });
130
+
131
+ // Generate request ID
132
+ const requestId = `admin_list_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
133
+
134
+ // Send list_all_agents message
135
+ const message = {
136
+ type: "list_all_agents" as const,
137
+ filter,
138
+ offset,
139
+ limit,
140
+ request_id: requestId
141
+ };
142
+
143
+ await this.wsClient.sendMessage(message);
144
+
145
+ // Wait for response
146
+ return new Promise((resolve, reject) => {
147
+ const timeout = setTimeout(() => {
148
+ this.pendingListRequests.delete(requestId);
149
+ reject(new SDKError("List agents request timed out", ErrorCode.TIMEOUT_ERROR));
150
+ }, this.requestTimeout);
151
+
152
+ this.pendingListRequests.set(requestId, { resolve, reject, timeout });
153
+ });
154
+ }
155
+
156
+ /**
157
+ * Gets the last received user count.
158
+ *
159
+ * @returns The last user count data, or null if not received yet
160
+ */
161
+ public getLastUserCount(): UserCountData | null {
162
+ return this.lastUserCount;
163
+ }
164
+
165
+ /**
166
+ * Handles incoming all_agents_response message from server.
167
+ * @internal
168
+ */
169
+ public handleAllAgentsResponse(
170
+ data: {
171
+ agents: AdminAgentInfo[];
172
+ total: number;
173
+ offset: number;
174
+ limit: number;
175
+ has_more: boolean;
176
+ filter?: string;
177
+ },
178
+ requestId?: string
179
+ ): void {
180
+ this.logger.debug("AdminManager: Received agents list", {
181
+ count: data.agents.length,
182
+ total: data.total,
183
+ requestId
184
+ });
185
+
186
+ const result: AllAgentsResult = {
187
+ agents: data.agents,
188
+ total: data.total,
189
+ offset: data.offset,
190
+ limit: data.limit,
191
+ hasMore: data.has_more,
192
+ filter: data.filter
193
+ };
194
+
195
+ // Resolve pending request - prefer matching by request_id if available
196
+ if (requestId && this.pendingListRequests.has(requestId)) {
197
+ // Exact match by request_id (preferred)
198
+ const pending = this.pendingListRequests.get(requestId)!;
199
+ clearTimeout(pending.timeout);
200
+ this.pendingListRequests.delete(requestId);
201
+ pending.resolve(result);
202
+ } else if (this.pendingListRequests.size > 0) {
203
+ // Fallback to FIFO for backwards compatibility (when server doesn't echo request_id)
204
+ const pendingEntries = Array.from(this.pendingListRequests.entries());
205
+ const [fallbackRequestId, pending] = pendingEntries[0];
206
+ this.logger.warn("AdminManager: Using FIFO fallback for list agents correlation", {
207
+ pendingCount: pendingEntries.length
208
+ });
209
+ clearTimeout(pending.timeout);
210
+ this.pendingListRequests.delete(fallbackRequestId);
211
+ pending.resolve(result);
212
+ }
213
+ }
214
+
215
+ /**
216
+ * Handles incoming user_count message from server.
217
+ * @internal
218
+ */
219
+ public handleUserCount(data: UserCountData): void {
220
+ this.logger.debug("AdminManager: Received user count", { count: data.count });
221
+
222
+ this.lastUserCount = data;
223
+ this.emit("user_count", data);
224
+ }
225
+
226
+ /**
227
+ * Clears all cached data and pending requests.
228
+ */
229
+ public clear(): void {
230
+ // Clear pending requests
231
+ for (const [, pending] of this.pendingListRequests) {
232
+ clearTimeout(pending.timeout);
233
+ pending.reject(new SDKError("Admin manager cleared", ErrorCode.SDK_DESTROYED));
234
+ }
235
+ this.pendingListRequests.clear();
236
+
237
+ this.lastUserCount = null;
238
+ }
239
+
240
+ /**
241
+ * Destroys the admin manager and cleans up resources.
242
+ */
243
+ public destroy(): void {
244
+ this.logger.info("AdminManager: Destroying");
245
+ this.clear();
246
+ this._isAdmin = false;
247
+ this.removeAllListeners();
248
+ }
249
+ }
@@ -59,7 +59,8 @@ describe("AgentRegistry", () => {
59
59
  registry.updateAgents([agent]);
60
60
 
61
61
  const agents = registry.getAgents();
62
- const firstAgent = agents[0] as any;
62
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
63
+ const firstAgent = agents[0] as Record<string, any>;
63
64
 
64
65
  // Mutate returned object
65
66
  firstAgent.name = "Modified";