@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
@@ -0,0 +1,484 @@
1
+ import { Injectable, Logger, OnModuleInit, OnModuleDestroy } from "@nestjs/common";
2
+ import { ConfigService } from "@nestjs/config";
3
+ import { TeneoSDK, SDKConfigBuilder, SecurePrivateKey } from "../../../../dist/index.js";
4
+
5
+ @Injectable()
6
+ export class TeneoService implements OnModuleInit, OnModuleDestroy {
7
+ private readonly logger = new Logger(TeneoService.name);
8
+ private sdk: TeneoSDK;
9
+ private messageCounter = 0;
10
+ private errorCounter = 0;
11
+ private recentEvents: any[] = [];
12
+ private recentMessages: any[] = [];
13
+ private recentWebhooks: any[] = [];
14
+ private sseClients: Set<any> = new Set();
15
+
16
+ constructor(private configService: ConfigService) {}
17
+
18
+ async onModuleInit() {
19
+ await this.initializeSDK();
20
+ }
21
+
22
+ async onModuleDestroy() {
23
+ if (this.sdk) {
24
+ this.logger.log("Disconnecting SDK...");
25
+ this.sdk.disconnect();
26
+ this.sdk.destroy();
27
+ }
28
+ }
29
+
30
+ private async initializeSDK() {
31
+ this.logger.log("Initializing Teneo SDK...");
32
+
33
+ const wsUrl = this.configService.get<string>("WS_URL");
34
+ const privateKey = this.configService.get<string>("PRIVATE_KEY");
35
+ const walletAddress = this.configService.get<string>("WALLET_ADDRESS") || undefined;
36
+ const enableSigVerification =
37
+ this.configService.get<string>("ENABLE_SIGNATURE_VERIFICATION") === "true";
38
+ const trustedAddresses =
39
+ this.configService.get<string>("TRUSTED_ADDRESSES")?.split(",").filter(Boolean) || [];
40
+
41
+ if (!wsUrl || !privateKey) {
42
+ throw new Error("Missing required environment variables: WS_URL, PRIVATE_KEY");
43
+ }
44
+
45
+ try {
46
+ const secureKey = new SecurePrivateKey(privateKey);
47
+ this.logger.log("Private key encrypted in memory");
48
+
49
+ const port = this.configService.get<string>("PORT") || "3002";
50
+ const webhookUrl = `http://localhost:${port}/api/webhook`;
51
+
52
+ const config = new SDKConfigBuilder()
53
+ .withWebSocketUrl(wsUrl)
54
+ .withAuthentication(secureKey, walletAddress)
55
+ .withReconnection({ enabled: true, delay: 5000, maxAttempts: 10 })
56
+ .withReconnectionStrategy({
57
+ type: "exponential",
58
+ baseDelay: 3000,
59
+ maxDelay: 120000,
60
+ maxAttempts: 15,
61
+ jitter: true,
62
+ backoffMultiplier: 2.5
63
+ })
64
+ .withWebhook(webhookUrl, {
65
+ "X-API-Key": "nestjs-dashboard-secret",
66
+ "Content-Type": "application/json"
67
+ })
68
+ .withResponseFormat({ format: "both", includeMetadata: true })
69
+ .withLogging("info")
70
+ .withCache(true, 300000, 100)
71
+ .withMessageDeduplication(true, 120000, 50000)
72
+ .withSignatureVerification({
73
+ enabled: enableSigVerification,
74
+ trustedAddresses,
75
+ requireFor: ["task_response", "agent_selected"],
76
+ strictMode: false
77
+ })
78
+ .build();
79
+
80
+ // Allow localhost webhooks for development
81
+ config.allowInsecureWebhooks = true;
82
+
83
+ this.sdk = new TeneoSDK(config);
84
+ this.logger.log(`Webhook configured for ${webhookUrl}`);
85
+
86
+ this.setupEventListeners();
87
+
88
+ this.logger.log("Connecting to Teneo Protocol...");
89
+ await this.sdk.connect();
90
+ this.logger.log("Successfully connected and authenticated!");
91
+ } catch (error) {
92
+ this.logger.error("Failed to initialize SDK:", error);
93
+ throw error;
94
+ }
95
+ }
96
+
97
+ private setupEventListeners() {
98
+ this.sdk.on("connection:open", () => {
99
+ this.logger.log("WebSocket connected");
100
+ this.addEvent("connection:open", { message: "Connected to WebSocket" });
101
+ this.broadcastSSE({ type: "connection", status: "connected" });
102
+ });
103
+
104
+ this.sdk.on("connection:close", (code, reason) => {
105
+ this.logger.warn(`WebSocket disconnected: ${code} - ${reason}`);
106
+ this.addEvent("connection:close", { code, reason });
107
+ this.broadcastSSE({ type: "connection", status: "disconnected", code, reason });
108
+ });
109
+
110
+ this.sdk.on("connection:reconnecting", (attempt) => {
111
+ this.logger.log(`Reconnecting... attempt ${attempt}`);
112
+ this.addEvent("connection:reconnecting", { attempt });
113
+ this.broadcastSSE({ type: "connection", status: "reconnecting", attempt });
114
+ });
115
+
116
+ this.sdk.on("connection:reconnected", () => {
117
+ this.logger.log("Reconnected successfully");
118
+ this.addEvent("connection:reconnected", { message: "Reconnected successfully" });
119
+ this.broadcastSSE({ type: "connection", status: "reconnected" });
120
+ });
121
+
122
+ this.sdk.on("auth:success", (state) => {
123
+ this.logger.log(`Authenticated as ${state.walletAddress}`);
124
+ this.addEvent("auth:success", { walletAddress: state.walletAddress });
125
+ this.broadcastSSE({ type: "auth", status: "success", state });
126
+ });
127
+
128
+ this.sdk.on("auth:error", (error) => {
129
+ this.logger.error("Authentication error:", error);
130
+ this.errorCounter++;
131
+ this.addEvent("auth:error", { error });
132
+ });
133
+
134
+ this.sdk.on("agent:selected", (data) => {
135
+ this.addEvent("agent:selected", { agentName: data.agentName, reasoning: data.reasoning });
136
+ this.broadcastSSE({ type: "agent:selected", data });
137
+ });
138
+
139
+ this.sdk.on("agent:response", (response) => {
140
+ this.logger.log(`Agent response from ${response.agentName}`);
141
+ this.addEvent("agent:response", { agentName: response.agentName, success: response.success });
142
+
143
+ // Store as a message if not already stored
144
+ const existingMsg = this.recentMessages.find((m) => !m.response);
145
+ if (existingMsg) {
146
+ existingMsg.response = response;
147
+ } else {
148
+ // This is an incoming message we didn't send
149
+ this.recentMessages.unshift({
150
+ id: `msg_${Date.now()}`,
151
+ timestamp: new Date().toISOString(),
152
+ content: "Incoming agent message",
153
+ from: response.agentName,
154
+ response: response
155
+ });
156
+ if (this.recentMessages.length > 100) this.recentMessages.pop();
157
+ }
158
+
159
+ this.broadcastSSE({ type: "agent:response", response });
160
+ });
161
+
162
+ this.sdk.on("room:created", (room) => {
163
+ this.addEvent("room:created", { roomId: room.id, name: room.name });
164
+ this.broadcastSSE({ type: "room:created", room });
165
+ });
166
+
167
+ this.sdk.on("room:updated", (room) => {
168
+ this.addEvent("room:updated", { roomId: room.id, name: room.name });
169
+ this.broadcastSSE({ type: "room:updated", room });
170
+ });
171
+
172
+ this.sdk.on("room:deleted", (roomId) => {
173
+ this.addEvent("room:deleted", { roomId });
174
+ this.broadcastSSE({ type: "room:deleted", roomId });
175
+ });
176
+
177
+ this.sdk.on("webhook:sent", (payload, url) => {
178
+ this.addEvent("webhook:sent", { event: payload.event, url });
179
+ });
180
+
181
+ this.sdk.on("webhook:success", (response, url) => {
182
+ this.addEvent("webhook:success", { url, status: response.status });
183
+ });
184
+
185
+ this.sdk.on("webhook:error", (error, url) => {
186
+ this.addEvent("webhook:error", { error: error.message, url });
187
+ this.errorCounter++;
188
+ });
189
+
190
+ this.sdk.on("error", (error) => {
191
+ this.logger.error("SDK error:", error.message);
192
+ this.errorCounter++;
193
+ this.addEvent("error", { message: error.message, code: error.code });
194
+ this.broadcastSSE({ type: "error", error: { message: error.message, code: error.code } });
195
+ });
196
+
197
+ this.sdk.on("ready", () => {
198
+ this.logger.log("SDK ready");
199
+ this.addEvent("ready", { message: "SDK ready" });
200
+ this.broadcastSSE({ type: "ready" });
201
+ });
202
+ }
203
+
204
+ private addEvent(type: string, data: any) {
205
+ const event = {
206
+ type,
207
+ timestamp: new Date().toISOString(),
208
+ data
209
+ };
210
+ this.recentEvents.unshift(event);
211
+ if (this.recentEvents.length > 100) this.recentEvents.pop();
212
+ }
213
+
214
+ private broadcastSSE(data: any) {
215
+ const message = `data: ${JSON.stringify(data)}\n\n`;
216
+ this.sseClients.forEach((client) => {
217
+ try {
218
+ client.write(message);
219
+ } catch (error) {
220
+ this.sseClients.delete(client);
221
+ }
222
+ });
223
+ }
224
+
225
+ isConnected(): boolean {
226
+ return this.sdk?.isConnected || false;
227
+ }
228
+
229
+ isAuthenticated(): boolean {
230
+ return this.sdk?.isAuthenticated || false;
231
+ }
232
+
233
+ getHealth() {
234
+ if (!this.sdk) {
235
+ return { status: "unhealthy", error: "SDK not initialized" };
236
+ }
237
+ return this.sdk.getHealth();
238
+ }
239
+
240
+ getMetrics() {
241
+ if (!this.sdk) {
242
+ throw new Error("SDK not initialized");
243
+ }
244
+
245
+ const connectionState = this.sdk.getConnectionState();
246
+ const authState = this.sdk.getAuthState();
247
+ const agents = this.sdk.getAgents();
248
+ const rooms = this.sdk.getRooms();
249
+
250
+ return {
251
+ connection: {
252
+ connected: this.sdk.isConnected,
253
+ authenticated: this.sdk.isAuthenticated,
254
+ reconnectAttempts: connectionState.reconnectAttempts
255
+ },
256
+ auth: {
257
+ walletAddress: authState.walletAddress,
258
+ rooms: authState.rooms?.length || 0
259
+ },
260
+ agents: {
261
+ total: agents.length,
262
+ online: agents.filter((a) => a.status === "online").length
263
+ },
264
+ rooms: {
265
+ total: rooms.length,
266
+ subscribedRooms: this.sdk.getSubscribedRooms()
267
+ },
268
+ messages: {
269
+ sent: this.messageCounter
270
+ },
271
+ errors: {
272
+ total: this.errorCounter
273
+ }
274
+ };
275
+ }
276
+
277
+ async sendMessage(content: string, room: string, waitForResponse = false) {
278
+ if (!this.sdk?.isConnected) {
279
+ throw new Error("SDK not connected");
280
+ }
281
+
282
+ this.messageCounter++;
283
+
284
+ const messageId = `msg_${Date.now()}`;
285
+ const storedMessage: any = {
286
+ id: messageId,
287
+ timestamp: new Date().toISOString(),
288
+ content,
289
+ from: "dashboard",
290
+ room
291
+ };
292
+ this.recentMessages.unshift(storedMessage);
293
+ if (this.recentMessages.length > 100) this.recentMessages.pop();
294
+
295
+ const response = await this.sdk.sendMessage(content, {
296
+ room,
297
+ waitForResponse,
298
+ timeout: 60000
299
+ });
300
+
301
+ if (response) {
302
+ storedMessage.response = response;
303
+ }
304
+
305
+ return response;
306
+ }
307
+
308
+ async sendDirectCommand(agent: string, command: string, room?: string) {
309
+ if (!this.sdk?.isConnected) {
310
+ throw new Error("SDK not connected");
311
+ }
312
+
313
+ return await this.sdk.sendDirectCommand({ agent, command, room });
314
+ }
315
+
316
+ getAgents() {
317
+ return this.sdk?.getAgents() || [];
318
+ }
319
+
320
+ findAgentsByCapability(capability: string) {
321
+ if (!this.sdk) {
322
+ throw new Error("SDK not initialized");
323
+ }
324
+ return this.sdk.findAgentsByCapability(capability);
325
+ }
326
+
327
+ findAgentsByName(name: string) {
328
+ if (!this.sdk) {
329
+ throw new Error("SDK not initialized");
330
+ }
331
+ return this.sdk.findAgentsByName(name);
332
+ }
333
+
334
+ findAgentsByStatus(status: string) {
335
+ if (!this.sdk) {
336
+ throw new Error("SDK not initialized");
337
+ }
338
+ return this.sdk.findAgentsByStatus(status);
339
+ }
340
+
341
+ getRooms() {
342
+ return this.sdk?.getRooms() || [];
343
+ }
344
+
345
+ getSubscribedRooms() {
346
+ return this.sdk?.getSubscribedRooms() || [];
347
+ }
348
+
349
+ getOwnedRooms() {
350
+ return this.sdk?.getOwnedRooms() || [];
351
+ }
352
+
353
+ getSharedRooms() {
354
+ return this.sdk?.getSharedRooms() || [];
355
+ }
356
+
357
+ async listRooms() {
358
+ if (!this.sdk?.isConnected) {
359
+ throw new Error("SDK not connected");
360
+ }
361
+ return await this.sdk.listRooms();
362
+ }
363
+
364
+ async subscribeToRoom(roomId: string) {
365
+ if (!this.sdk?.isConnected) {
366
+ throw new Error("SDK not connected");
367
+ }
368
+ return await this.sdk.subscribeToRoom(roomId);
369
+ }
370
+
371
+ async unsubscribeFromRoom(roomId: string) {
372
+ if (!this.sdk?.isConnected) {
373
+ throw new Error("SDK not connected");
374
+ }
375
+ return await this.sdk.unsubscribeFromRoom(roomId);
376
+ }
377
+
378
+ async createRoom(name: string, description?: string) {
379
+ if (!this.sdk?.isConnected) {
380
+ throw new Error("SDK not connected");
381
+ }
382
+ return await this.sdk.createRoom({ name, description });
383
+ }
384
+
385
+ async updateRoom(roomId: string, updates: { name?: string; description?: string }) {
386
+ if (!this.sdk?.isConnected) {
387
+ throw new Error("SDK not connected");
388
+ }
389
+ return await this.sdk.updateRoom(roomId, updates);
390
+ }
391
+
392
+ async deleteRoom(roomId: string) {
393
+ if (!this.sdk?.isConnected) {
394
+ throw new Error("SDK not connected");
395
+ }
396
+ return await this.sdk.deleteRoom(roomId);
397
+ }
398
+
399
+ getRoomLimit() {
400
+ return this.sdk?.getRoomLimit();
401
+ }
402
+
403
+ getOwnedRoomCount() {
404
+ return this.sdk?.getOwnedRoomCount();
405
+ }
406
+
407
+ canCreateRoom() {
408
+ return this.sdk?.canCreateRoom();
409
+ }
410
+
411
+ async listRoomAgents(roomId: string, useCache = true) {
412
+ if (!this.sdk?.isConnected) {
413
+ throw new Error("SDK not connected");
414
+ }
415
+ return await this.sdk.listRoomAgents(roomId, useCache);
416
+ }
417
+
418
+ async listAvailableAgents(roomId: string, useCache = true) {
419
+ if (!this.sdk?.isConnected) {
420
+ throw new Error("SDK not connected");
421
+ }
422
+ return await this.sdk.listAvailableAgents(roomId, useCache);
423
+ }
424
+
425
+ async addAgentToRoom(roomId: string, agentId: string) {
426
+ if (!this.sdk?.isConnected) {
427
+ throw new Error("SDK not connected");
428
+ }
429
+ return await this.sdk.addAgentToRoom(roomId, agentId);
430
+ }
431
+
432
+ async removeAgentFromRoom(roomId: string, agentId: string) {
433
+ if (!this.sdk?.isConnected) {
434
+ throw new Error("SDK not connected");
435
+ }
436
+ return await this.sdk.removeAgentFromRoom(roomId, agentId);
437
+ }
438
+
439
+ isAgentInRoom(roomId: string, agentId: string) {
440
+ return this.sdk?.isAgentInRoom(roomId, agentId) || false;
441
+ }
442
+
443
+ getRoomAgentCount(roomId: string) {
444
+ return this.sdk?.getRoomAgentCount(roomId) || 0;
445
+ }
446
+
447
+ invalidateAgentRoomCache(roomId?: string) {
448
+ this.sdk?.invalidateAgentRoomCache(roomId);
449
+ }
450
+
451
+ getSDK(): TeneoSDK | null {
452
+ return this.sdk;
453
+ }
454
+
455
+ // SSE Management
456
+ addSSEClient(client: any) {
457
+ this.sseClients.add(client);
458
+ }
459
+
460
+ removeSSEClient(client: any) {
461
+ this.sseClients.delete(client);
462
+ }
463
+
464
+ getRecentEvents() {
465
+ return this.recentEvents.slice(0, 50);
466
+ }
467
+
468
+ getRecentMessages() {
469
+ return this.recentMessages.slice(0, 20);
470
+ }
471
+
472
+ getRecentWebhooks() {
473
+ return this.recentWebhooks.slice(0, 20);
474
+ }
475
+
476
+ addWebhook(webhook: any) {
477
+ this.recentWebhooks.unshift({
478
+ ...webhook,
479
+ receivedAt: new Date().toISOString()
480
+ });
481
+ if (this.recentWebhooks.length > 50) this.recentWebhooks.pop();
482
+ this.broadcastSSE({ type: "webhook:received", payload: webhook });
483
+ }
484
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "commonjs",
4
+ "declaration": true,
5
+ "removeComments": true,
6
+ "emitDecoratorMetadata": true,
7
+ "experimentalDecorators": true,
8
+ "allowSyntheticDefaultImports": true,
9
+ "target": "ES2021",
10
+ "sourceMap": true,
11
+ "outDir": "./dist",
12
+ "baseUrl": "./",
13
+ "incremental": true,
14
+ "skipLibCheck": true,
15
+ "strictNullChecks": false,
16
+ "noImplicitAny": false,
17
+ "strictBindCallApply": false,
18
+ "forceConsistentCasingInFileNames": false,
19
+ "noFallthroughCasesInSwitch": false,
20
+ "esModuleInterop": true
21
+ }
22
+ }
@@ -13,7 +13,7 @@ OPENAI_API_KEY=sk-...
13
13
  OPENAI_MODEL=gpt-4-turbo-preview
14
14
 
15
15
  # ============================================================================
16
- # REQUIRED: Teneo Network Connection
16
+ # REQUIRED: Teneo Protocol Connection
17
17
  # ============================================================================
18
18
 
19
19
  # WebSocket URL for Teneo AI Network
@@ -65,7 +65,7 @@ cp examples/openai-teneo/.env.example examples/openai-teneo/.env
65
65
  # OpenAI Configuration
66
66
  OPENAI_API_KEY=sk-proj-your-openai-api-key-here
67
67
 
68
- # Teneo Network Connection
68
+ # Teneo Protocol Connection
69
69
  WS_URL=wss://your-teneo-server.com/ws
70
70
  PRIVATE_KEY=0x1234567890123456789012345678901234567890123456789012345678901234
71
71
  WALLET_ADDRESS=0x1234567890123456789012345678901234567890 # Optional - auto-derived from private key
@@ -312,7 +312,7 @@ console.log('Codex Response:', data2.data.response);
312
312
  │ │
313
313
  ▼ ▼
314
314
  ┌─────────────────┐ ┌─────────────────┐
315
- │ OpenAI Codex │ │ Teneo Network
315
+ │ OpenAI Codex │ │ Teneo Protocol
316
316
  │ (Agent Select) │ │ (X-Agent, etc) │
317
317
  └─────────────────┘ └─────────────────┘
318
318