@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,54 @@
1
+ import { Controller, Get, Param, HttpException, HttpStatus } from "@nestjs/common";
2
+ import { TeneoService } from "./teneo.service";
3
+
4
+ @Controller("api/agents")
5
+ export class AgentsController {
6
+ constructor(private readonly teneoService: TeneoService) {}
7
+
8
+ @Get()
9
+ getAgents() {
10
+ return this.teneoService.getAgents();
11
+ }
12
+
13
+ @Get("search/capability/:capability")
14
+ findAgentsByCapability(@Param("capability") capability: string) {
15
+ try {
16
+ const agents = this.teneoService.findAgentsByCapability(capability);
17
+ return {
18
+ capability,
19
+ count: agents.length,
20
+ agents
21
+ };
22
+ } catch (error) {
23
+ throw new HttpException(error.message, HttpStatus.BAD_REQUEST);
24
+ }
25
+ }
26
+
27
+ @Get("search/name/:name")
28
+ findAgentsByName(@Param("name") name: string) {
29
+ try {
30
+ const agents = this.teneoService.findAgentsByName(name);
31
+ return {
32
+ query: name,
33
+ count: agents.length,
34
+ agents
35
+ };
36
+ } catch (error) {
37
+ throw new HttpException(error.message, HttpStatus.BAD_REQUEST);
38
+ }
39
+ }
40
+
41
+ @Get("search/status/:status")
42
+ findAgentsByStatus(@Param("status") status: string) {
43
+ try {
44
+ const agents = this.teneoService.findAgentsByStatus(status);
45
+ return {
46
+ status,
47
+ count: agents.length,
48
+ agents
49
+ };
50
+ } catch (error) {
51
+ throw new HttpException(error.message, HttpStatus.BAD_REQUEST);
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,65 @@
1
+ import { Controller, Get, Post, Body, Res } from "@nestjs/common";
2
+ import { Response } from "express";
3
+ import { TeneoService } from "./teneo.service";
4
+
5
+ @Controller("api")
6
+ export class EventsController {
7
+ constructor(private readonly teneoService: TeneoService) {}
8
+
9
+ @Get("events")
10
+ getEvents() {
11
+ return this.teneoService.getRecentEvents();
12
+ }
13
+
14
+ @Get("messages")
15
+ getMessages() {
16
+ return this.teneoService.getRecentMessages();
17
+ }
18
+
19
+ @Get("webhooks")
20
+ getWebhooks() {
21
+ return this.teneoService.getRecentWebhooks();
22
+ }
23
+
24
+ @Post("webhook")
25
+ receiveWebhook(@Body() body: any) {
26
+ this.teneoService.addWebhook(body);
27
+ return { status: "success", received: true };
28
+ }
29
+
30
+ @Get("sse")
31
+ sseEndpoint(@Res() res: Response) {
32
+ res.setHeader("Content-Type", "text/event-stream");
33
+ res.setHeader("Cache-Control", "no-cache");
34
+ res.setHeader("Connection", "keep-alive");
35
+ res.flushHeaders();
36
+
37
+ this.teneoService.addSSEClient(res);
38
+
39
+ // Send initial connection status
40
+ const connected = this.teneoService.isConnected();
41
+ const authenticated = this.teneoService.isAuthenticated();
42
+
43
+ res.write(
44
+ `data: ${JSON.stringify({ type: "connection", status: connected ? "connected" : "disconnected" })}\n\n`
45
+ );
46
+ res.write(
47
+ `data: ${JSON.stringify({ type: "auth", status: authenticated ? "success" : "pending" })}\n\n`
48
+ );
49
+
50
+ // Keep-alive ping every 30 seconds
51
+ const keepAliveInterval = setInterval(() => {
52
+ try {
53
+ res.write(": ping\n\n");
54
+ } catch {
55
+ clearInterval(keepAliveInterval);
56
+ this.teneoService.removeSSEClient(res);
57
+ }
58
+ }, 30000);
59
+
60
+ res.on("close", () => {
61
+ clearInterval(keepAliveInterval);
62
+ this.teneoService.removeSSEClient(res);
63
+ });
64
+ }
65
+ }
@@ -0,0 +1,47 @@
1
+ import { Controller, Post, Body, HttpException, HttpStatus } from "@nestjs/common";
2
+ import { TeneoService } from "./teneo.service";
3
+
4
+ @Controller("api/messages")
5
+ export class MessagesController {
6
+ constructor(private readonly teneoService: TeneoService) {}
7
+
8
+ @Post()
9
+ async sendMessage(@Body() body: { content: string; room: string; waitForResponse?: boolean }) {
10
+ if (!body.content || typeof body.content !== "string") {
11
+ throw new HttpException("Content is required", HttpStatus.BAD_REQUEST);
12
+ }
13
+
14
+ if (!body.room || typeof body.room !== "string") {
15
+ throw new HttpException("Room is required", HttpStatus.BAD_REQUEST);
16
+ }
17
+
18
+ try {
19
+ const response = await this.teneoService.sendMessage(
20
+ body.content,
21
+ body.room,
22
+ body.waitForResponse || false
23
+ );
24
+
25
+ return {
26
+ success: true,
27
+ response: response || null
28
+ };
29
+ } catch (error) {
30
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
31
+ }
32
+ }
33
+
34
+ @Post("direct-command")
35
+ async sendDirectCommand(@Body() body: { agent: string; command: string; room?: string }) {
36
+ if (!body.agent || !body.command) {
37
+ throw new HttpException("Agent and command are required", HttpStatus.BAD_REQUEST);
38
+ }
39
+
40
+ try {
41
+ await this.teneoService.sendDirectCommand(body.agent, body.command, body.room);
42
+ return { success: true };
43
+ } catch (error) {
44
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,258 @@
1
+ import {
2
+ Controller,
3
+ Get,
4
+ Post,
5
+ Put,
6
+ Delete,
7
+ Body,
8
+ Param,
9
+ Query,
10
+ HttpException,
11
+ HttpStatus
12
+ } from "@nestjs/common";
13
+ import { TeneoService } from "./teneo.service";
14
+
15
+ @Controller("api/rooms")
16
+ export class RoomsController {
17
+ constructor(private readonly teneoService: TeneoService) {}
18
+
19
+ @Get()
20
+ getRooms() {
21
+ return this.teneoService.getRooms();
22
+ }
23
+
24
+ @Get("list")
25
+ async listRooms() {
26
+ try {
27
+ return await this.teneoService.listRooms();
28
+ } catch (error) {
29
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
30
+ }
31
+ }
32
+
33
+ @Get("available")
34
+ getAvailableRooms() {
35
+ const subscribedRooms = this.teneoService.getSubscribedRooms();
36
+ const ownedRooms = this.teneoService.getOwnedRooms();
37
+ const sharedRooms = this.teneoService.getSharedRooms();
38
+
39
+ const availableRooms: Array<{
40
+ id: string;
41
+ name: string;
42
+ type: string;
43
+ description?: string;
44
+ }> = [];
45
+
46
+ if (subscribedRooms?.length > 0) {
47
+ subscribedRooms.forEach((roomId: string) => {
48
+ availableRooms.push({
49
+ id: roomId,
50
+ name: roomId,
51
+ type: "subscribed"
52
+ });
53
+ });
54
+ }
55
+
56
+ if (ownedRooms?.length > 0) {
57
+ ownedRooms.forEach((room) => {
58
+ if (!availableRooms.find((r) => r.id === room.id)) {
59
+ availableRooms.push({
60
+ id: room.id,
61
+ name: room.name || room.id,
62
+ type: room.is_public ? "public" : "private",
63
+ description: room.description || undefined
64
+ });
65
+ }
66
+ });
67
+ }
68
+
69
+ if (sharedRooms?.length > 0) {
70
+ sharedRooms.forEach((room) => {
71
+ if (!availableRooms.find((r) => r.id === room.id)) {
72
+ availableRooms.push({
73
+ id: room.id,
74
+ name: room.name || room.id,
75
+ type: room.is_public ? "public" : "private",
76
+ description: room.description || undefined
77
+ });
78
+ }
79
+ });
80
+ }
81
+
82
+ return availableRooms;
83
+ }
84
+
85
+ @Post("join")
86
+ async joinRoom(@Body() body: { roomId: string }) {
87
+ if (!body.roomId) {
88
+ throw new HttpException("Room ID is required", HttpStatus.BAD_REQUEST);
89
+ }
90
+
91
+ try {
92
+ await this.teneoService.subscribeToRoom(body.roomId);
93
+ return { success: true };
94
+ } catch (error) {
95
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
96
+ }
97
+ }
98
+
99
+ @Post("leave")
100
+ async leaveRoom(@Body() body: { roomId: string }) {
101
+ if (!body.roomId) {
102
+ throw new HttpException("Room ID is required", HttpStatus.BAD_REQUEST);
103
+ }
104
+
105
+ try {
106
+ await this.teneoService.unsubscribeFromRoom(body.roomId);
107
+ return { success: true };
108
+ } catch (error) {
109
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
110
+ }
111
+ }
112
+
113
+ @Get("owned")
114
+ getOwnedRooms() {
115
+ return this.teneoService.getOwnedRooms();
116
+ }
117
+
118
+ @Get("shared")
119
+ getSharedRooms() {
120
+ return this.teneoService.getSharedRooms();
121
+ }
122
+
123
+ @Get("limit")
124
+ getRoomLimit() {
125
+ return {
126
+ limit: this.teneoService.getRoomLimit(),
127
+ count: this.teneoService.getOwnedRoomCount(),
128
+ canCreate: this.teneoService.canCreateRoom()
129
+ };
130
+ }
131
+
132
+ @Post()
133
+ async createRoom(@Body() body: { name: string; description?: string }) {
134
+ if (!body.name) {
135
+ throw new HttpException("Room name is required", HttpStatus.BAD_REQUEST);
136
+ }
137
+
138
+ try {
139
+ return await this.teneoService.createRoom(body.name, body.description);
140
+ } catch (error) {
141
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
142
+ }
143
+ }
144
+
145
+ @Put(":id")
146
+ async updateRoom(@Param("id") id: string, @Body() body: { name?: string; description?: string }) {
147
+ if (!body.name && !body.description) {
148
+ throw new HttpException(
149
+ "At least one field (name or description) must be provided",
150
+ HttpStatus.BAD_REQUEST
151
+ );
152
+ }
153
+
154
+ try {
155
+ return await this.teneoService.updateRoom(id, body);
156
+ } catch (error) {
157
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
158
+ }
159
+ }
160
+
161
+ @Delete(":id")
162
+ async deleteRoom(@Param("id") id: string) {
163
+ try {
164
+ await this.teneoService.deleteRoom(id);
165
+ return { success: true, message: "Room deleted successfully" };
166
+ } catch (error) {
167
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
168
+ }
169
+ }
170
+
171
+ @Get(":id/agents")
172
+ async listRoomAgents(@Param("id") id: string, @Query("cache") cache?: string) {
173
+ try {
174
+ const useCache = cache !== "false";
175
+ const agents = await this.teneoService.listRoomAgents(id, useCache);
176
+ return {
177
+ roomId: id,
178
+ agents,
179
+ cached: useCache,
180
+ count: agents.length
181
+ };
182
+ } catch (error) {
183
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
184
+ }
185
+ }
186
+
187
+ @Get(":id/available-agents")
188
+ async listAvailableAgents(@Param("id") id: string, @Query("cache") cache?: string) {
189
+ try {
190
+ const useCache = cache !== "false";
191
+ const agents = await this.teneoService.listAvailableAgents(id, useCache);
192
+ return {
193
+ roomId: id,
194
+ agents,
195
+ cached: useCache,
196
+ count: agents.length
197
+ };
198
+ } catch (error) {
199
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
200
+ }
201
+ }
202
+
203
+ @Post(":roomId/agents/:agentId")
204
+ async addAgentToRoom(@Param("roomId") roomId: string, @Param("agentId") agentId: string) {
205
+ try {
206
+ await this.teneoService.addAgentToRoom(roomId, agentId);
207
+ return {
208
+ success: true,
209
+ message: `Agent ${agentId} added to room ${roomId}`
210
+ };
211
+ } catch (error) {
212
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
213
+ }
214
+ }
215
+
216
+ @Delete(":roomId/agents/:agentId")
217
+ async removeAgentFromRoom(@Param("roomId") roomId: string, @Param("agentId") agentId: string) {
218
+ try {
219
+ await this.teneoService.removeAgentFromRoom(roomId, agentId);
220
+ return {
221
+ success: true,
222
+ message: `Agent ${agentId} removed from room ${roomId}`
223
+ };
224
+ } catch (error) {
225
+ throw new HttpException(error.message, HttpStatus.INTERNAL_SERVER_ERROR);
226
+ }
227
+ }
228
+
229
+ @Get(":roomId/agents/:agentId/check")
230
+ checkAgentInRoom(@Param("roomId") roomId: string, @Param("agentId") agentId: string) {
231
+ const isInRoom = this.teneoService.isAgentInRoom(roomId, agentId);
232
+ return {
233
+ roomId,
234
+ agentId,
235
+ inRoom: isInRoom,
236
+ cached: true
237
+ };
238
+ }
239
+
240
+ @Get(":id/agents/count")
241
+ getRoomAgentCount(@Param("id") id: string) {
242
+ const count = this.teneoService.getRoomAgentCount(id);
243
+ return {
244
+ roomId: id,
245
+ count,
246
+ cached: true
247
+ };
248
+ }
249
+
250
+ @Post(":id/cache/invalidate")
251
+ invalidateCache(@Param("id") id: string) {
252
+ this.teneoService.invalidateAgentRoomCache(id);
253
+ return {
254
+ success: true,
255
+ message: `Cache invalidated for room ${id}`
256
+ };
257
+ }
258
+ }
@@ -0,0 +1,13 @@
1
+ import { Module } from "@nestjs/common";
2
+ import { TeneoService } from "./teneo.service";
3
+ import { MessagesController } from "./messages.controller";
4
+ import { RoomsController } from "./rooms.controller";
5
+ import { AgentsController } from "./agents.controller";
6
+ import { EventsController } from "./events.controller";
7
+
8
+ @Module({
9
+ providers: [TeneoService],
10
+ controllers: [MessagesController, RoomsController, AgentsController, EventsController],
11
+ exports: [TeneoService]
12
+ })
13
+ export class TeneoModule {}