@teneo-protocol/sdk 1.0.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (352) hide show
  1. package/.eslintrc.json +11 -2
  2. package/.github/CODEOWNERS +2 -0
  3. package/.github/ISSUE_TEMPLATE/01-bug.yml +85 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +8 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  6. package/.github/workflows/claude-code-review.yml +8 -3
  7. package/.github/workflows/claude-reviewer.yml +6 -4
  8. package/.github/workflows/publish-npm.yml +9 -6
  9. package/.github/workflows/push-to-main.yml +1 -1
  10. package/.github/workflows/top-issue.yml +102 -0
  11. package/CHANGELOG.md +334 -0
  12. package/CONCEPTS.md +747 -0
  13. package/README.md +577 -54
  14. package/dist/constants.js +8 -8
  15. package/dist/constants.js.map +1 -1
  16. package/dist/core/websocket-client.d.ts +25 -1
  17. package/dist/core/websocket-client.d.ts.map +1 -1
  18. package/dist/core/websocket-client.js +74 -15
  19. package/dist/core/websocket-client.js.map +1 -1
  20. package/dist/formatters/response-formatter.js +4 -0
  21. package/dist/formatters/response-formatter.js.map +1 -1
  22. package/dist/handlers/message-handler-registry.js +2 -1
  23. package/dist/handlers/message-handler-registry.js.map +1 -1
  24. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +1666 -0
  25. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts.map +1 -0
  26. package/dist/handlers/message-handlers/agent-details-response-handler.js +38 -0
  27. package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -0
  28. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
  29. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
  30. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +67 -0
  31. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
  32. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
  33. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  34. package/dist/handlers/message-handlers/agent-selected-handler.js +2 -5
  35. package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -1
  36. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +1687 -0
  37. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
  38. package/dist/handlers/message-handlers/agent-status-update-handler.js +48 -0
  39. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
  40. package/dist/handlers/message-handlers/agents-list-handler.js +2 -5
  41. package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -1
  42. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +439 -0
  43. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -0
  44. package/dist/handlers/message-handlers/all-agents-response-handler.js +36 -0
  45. package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -0
  46. package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
  47. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  48. package/dist/handlers/message-handlers/auth-error-handler.js +2 -5
  49. package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -1
  50. package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
  51. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  52. package/dist/handlers/message-handlers/auth-message-handler.js +71 -10
  53. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  54. package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
  55. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  56. package/dist/handlers/message-handlers/auth-required-handler.js +2 -5
  57. package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -1
  58. package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
  59. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  60. package/dist/handlers/message-handlers/auth-success-handler.js +52 -9
  61. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  62. package/dist/handlers/message-handlers/base-handler.d.ts +4 -4
  63. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
  64. package/dist/handlers/message-handlers/base-handler.js +3 -1
  65. package/dist/handlers/message-handlers/base-handler.js.map +1 -1
  66. package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
  67. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  68. package/dist/handlers/message-handlers/challenge-handler.js +3 -2
  69. package/dist/handlers/message-handlers/challenge-handler.js.map +1 -1
  70. package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
  71. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  72. package/dist/handlers/message-handlers/error-message-handler.js +2 -5
  73. package/dist/handlers/message-handlers/error-message-handler.js.map +1 -1
  74. package/dist/handlers/message-handlers/index.d.ts +11 -0
  75. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  76. package/dist/handlers/message-handlers/index.js +55 -1
  77. package/dist/handlers/message-handlers/index.js.map +1 -1
  78. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +1660 -0
  79. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
  80. package/dist/handlers/message-handlers/list-available-agents-handler.js +35 -0
  81. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
  82. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +1669 -0
  83. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
  84. package/dist/handlers/message-handlers/list-room-agents-handler.js +48 -0
  85. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
  86. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +2 -110
  87. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  88. package/dist/handlers/message-handlers/list-rooms-response-handler.js +4 -6
  89. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
  90. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
  91. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  92. package/dist/handlers/message-handlers/ping-pong-handler.js +4 -10
  93. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
  94. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts +94 -0
  95. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -0
  96. package/dist/handlers/message-handlers/rate-limit-notification-handler.js +35 -0
  97. package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -0
  98. package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
  99. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  100. package/dist/handlers/message-handlers/regular-message-handler.js +4 -6
  101. package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
  102. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
  103. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
  104. package/dist/handlers/message-handlers/room-operation-response-handler.js +89 -0
  105. package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
  106. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
  107. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  108. package/dist/handlers/message-handlers/subscribe-response-handler.js +4 -6
  109. package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -1
  110. package/dist/handlers/message-handlers/task-quote-handler.d.ts +14 -0
  111. package/dist/handlers/message-handlers/task-quote-handler.d.ts.map +1 -0
  112. package/dist/handlers/message-handlers/task-quote-handler.js +29 -0
  113. package/dist/handlers/message-handlers/task-quote-handler.js.map +1 -0
  114. package/dist/handlers/message-handlers/task-response-handler.js +2 -5
  115. package/dist/handlers/message-handlers/task-response-handler.js.map +1 -1
  116. package/dist/handlers/message-handlers/types.d.ts +21 -7
  117. package/dist/handlers/message-handlers/types.d.ts.map +1 -1
  118. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
  119. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  120. package/dist/handlers/message-handlers/unsubscribe-response-handler.js +4 -6
  121. package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -1
  122. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts +40 -0
  123. package/dist/handlers/message-handlers/user-authenticated-handler.d.ts.map +1 -0
  124. package/dist/handlers/message-handlers/user-authenticated-handler.js +28 -0
  125. package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -0
  126. package/dist/handlers/message-handlers/user-count-handler.d.ts +49 -0
  127. package/dist/handlers/message-handlers/user-count-handler.d.ts.map +1 -0
  128. package/dist/handlers/message-handlers/user-count-handler.js +31 -0
  129. package/dist/handlers/message-handlers/user-count-handler.js.map +1 -0
  130. package/dist/handlers/webhook-handler.d.ts +1 -1
  131. package/dist/handlers/webhook-handler.d.ts.map +1 -1
  132. package/dist/handlers/webhook-handler.js +14 -5
  133. package/dist/handlers/webhook-handler.js.map +1 -1
  134. package/dist/index.d.ts +6 -1
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +19 -2
  137. package/dist/index.js.map +1 -1
  138. package/dist/managers/admin-manager.d.ts +116 -0
  139. package/dist/managers/admin-manager.d.ts.map +1 -0
  140. package/dist/managers/admin-manager.js +169 -0
  141. package/dist/managers/admin-manager.js.map +1 -0
  142. package/dist/managers/agent-registry.d.ts +52 -1
  143. package/dist/managers/agent-registry.d.ts.map +1 -1
  144. package/dist/managers/agent-registry.js +145 -6
  145. package/dist/managers/agent-registry.js.map +1 -1
  146. package/dist/managers/agent-room-manager.d.ts +216 -0
  147. package/dist/managers/agent-room-manager.d.ts.map +1 -0
  148. package/dist/managers/agent-room-manager.js +555 -0
  149. package/dist/managers/agent-room-manager.js.map +1 -0
  150. package/dist/managers/connection-manager.js +2 -0
  151. package/dist/managers/connection-manager.js.map +1 -1
  152. package/dist/managers/index.d.ts +4 -1
  153. package/dist/managers/index.d.ts.map +1 -1
  154. package/dist/managers/index.js +7 -1
  155. package/dist/managers/index.js.map +1 -1
  156. package/dist/managers/message-router.d.ts +56 -5
  157. package/dist/managers/message-router.d.ts.map +1 -1
  158. package/dist/managers/message-router.js +155 -8
  159. package/dist/managers/message-router.js.map +1 -1
  160. package/dist/managers/room-management-manager.d.ts +213 -0
  161. package/dist/managers/room-management-manager.d.ts.map +1 -0
  162. package/dist/managers/room-management-manager.js +442 -0
  163. package/dist/managers/room-management-manager.js.map +1 -0
  164. package/dist/managers/room-manager.d.ts +11 -9
  165. package/dist/managers/room-manager.d.ts.map +1 -1
  166. package/dist/managers/room-manager.js +14 -10
  167. package/dist/managers/room-manager.js.map +1 -1
  168. package/dist/payments/index.d.ts +5 -0
  169. package/dist/payments/index.d.ts.map +1 -0
  170. package/dist/payments/index.js +21 -0
  171. package/dist/payments/index.js.map +1 -0
  172. package/dist/payments/payment-client.d.ts +74 -0
  173. package/dist/payments/payment-client.d.ts.map +1 -0
  174. package/dist/payments/payment-client.js +207 -0
  175. package/dist/payments/payment-client.js.map +1 -0
  176. package/dist/teneo-sdk.d.ts +467 -33
  177. package/dist/teneo-sdk.d.ts.map +1 -1
  178. package/dist/teneo-sdk.js +735 -26
  179. package/dist/teneo-sdk.js.map +1 -1
  180. package/dist/types/categories.d.ts +22 -0
  181. package/dist/types/categories.d.ts.map +1 -0
  182. package/dist/types/categories.js +40 -0
  183. package/dist/types/categories.js.map +1 -0
  184. package/dist/types/config.d.ts +134 -54
  185. package/dist/types/config.d.ts.map +1 -1
  186. package/dist/types/config.js +70 -9
  187. package/dist/types/config.js.map +1 -1
  188. package/dist/types/error-codes.d.ts +10 -0
  189. package/dist/types/error-codes.d.ts.map +1 -1
  190. package/dist/types/error-codes.js +12 -0
  191. package/dist/types/error-codes.js.map +1 -1
  192. package/dist/types/events.d.ts +176 -68
  193. package/dist/types/events.d.ts.map +1 -1
  194. package/dist/types/events.js +19 -1
  195. package/dist/types/events.js.map +1 -1
  196. package/dist/types/index.d.ts +3 -2
  197. package/dist/types/index.d.ts.map +1 -1
  198. package/dist/types/index.js +57 -2
  199. package/dist/types/index.js.map +1 -1
  200. package/dist/types/messages.d.ts +22225 -2592
  201. package/dist/types/messages.d.ts.map +1 -1
  202. package/dist/types/messages.js +537 -28
  203. package/dist/types/messages.js.map +1 -1
  204. package/dist/utils/bounded-queue.d.ts.map +1 -1
  205. package/dist/utils/bounded-queue.js +5 -2
  206. package/dist/utils/bounded-queue.js.map +1 -1
  207. package/dist/utils/circuit-breaker.js +11 -4
  208. package/dist/utils/circuit-breaker.js.map +1 -1
  209. package/dist/utils/deduplication-cache.js +3 -1
  210. package/dist/utils/deduplication-cache.js.map +1 -1
  211. package/dist/utils/event-waiter.d.ts +3 -3
  212. package/dist/utils/event-waiter.d.ts.map +1 -1
  213. package/dist/utils/index.d.ts +1 -0
  214. package/dist/utils/index.d.ts.map +1 -1
  215. package/dist/utils/index.js +4 -1
  216. package/dist/utils/index.js.map +1 -1
  217. package/dist/utils/logger.js.map +1 -1
  218. package/dist/utils/pricing-resolver.d.ts +26 -0
  219. package/dist/utils/pricing-resolver.d.ts.map +1 -0
  220. package/dist/utils/pricing-resolver.js +85 -0
  221. package/dist/utils/pricing-resolver.js.map +1 -0
  222. package/dist/utils/rate-limiter.d.ts.map +1 -1
  223. package/dist/utils/rate-limiter.js +6 -0
  224. package/dist/utils/rate-limiter.js.map +1 -1
  225. package/dist/utils/retry-policy.js +1 -0
  226. package/dist/utils/retry-policy.js.map +1 -1
  227. package/dist/utils/secure-private-key.js +3 -1
  228. package/dist/utils/secure-private-key.js.map +1 -1
  229. package/dist/utils/signature-verifier.d.ts.map +1 -1
  230. package/dist/utils/signature-verifier.js +3 -1
  231. package/dist/utils/signature-verifier.js.map +1 -1
  232. package/examples/.env.example +2 -2
  233. package/examples/agent-room-management-example.ts +335 -0
  234. package/examples/basic-usage.ts +3 -4
  235. package/examples/claude-agent-x-follower/.env.example +3 -3
  236. package/examples/claude-agent-x-follower/QUICKSTART.md +3 -3
  237. package/examples/claude-agent-x-follower/README.md +3 -3
  238. package/examples/claude-agent-x-follower/index.ts +120 -96
  239. package/examples/n8n-teneo/.env.example +3 -3
  240. package/examples/n8n-teneo/README.md +2 -2
  241. package/examples/n8n-teneo/index.ts +54 -44
  242. package/examples/nestjs-dashboard/.env.example +11 -0
  243. package/examples/nestjs-dashboard/README.md +297 -0
  244. package/examples/nestjs-dashboard/nest-cli.json +10 -0
  245. package/examples/nestjs-dashboard/package.json +44 -0
  246. package/examples/nestjs-dashboard/pnpm-lock.yaml +3079 -0
  247. package/examples/nestjs-dashboard/src/app.controller.ts +24 -0
  248. package/examples/nestjs-dashboard/src/app.module.ts +15 -0
  249. package/examples/nestjs-dashboard/src/main.ts +32 -0
  250. package/examples/nestjs-dashboard/src/public/dashboard.html +1144 -0
  251. package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +54 -0
  252. package/examples/nestjs-dashboard/src/teneo/events.controller.ts +65 -0
  253. package/examples/nestjs-dashboard/src/teneo/messages.controller.ts +47 -0
  254. package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +258 -0
  255. package/examples/nestjs-dashboard/src/teneo/teneo.module.ts +13 -0
  256. package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +484 -0
  257. package/examples/nestjs-dashboard/tsconfig.json +22 -0
  258. package/examples/openai-teneo/.env.example +3 -3
  259. package/examples/openai-teneo/README.md +3 -3
  260. package/examples/openai-teneo/index.ts +82 -71
  261. package/examples/production-dashboard/.env.example +3 -3
  262. package/examples/production-dashboard/README.md +90 -13
  263. package/examples/production-dashboard/public/dashboard.html +1173 -601
  264. package/examples/production-dashboard/server.ts +349 -7
  265. package/examples/room-management-example.ts +282 -0
  266. package/examples/usage/.env.example +2 -2
  267. package/examples/usage/01-connect.ts +3 -4
  268. package/examples/usage/02-list-agents.ts +2 -3
  269. package/examples/usage/03-pick-agent.ts +2 -3
  270. package/examples/usage/04-find-by-capability.ts +2 -3
  271. package/examples/usage/05-webhook-example.ts +2 -3
  272. package/examples/usage/06-simple-api-server.ts +2 -3
  273. package/examples/usage/07-event-listener.ts +2 -3
  274. package/examples/usage/README.md +1 -1
  275. package/examples/webhook-integration.ts +1 -1
  276. package/examples/x-influencer-battle-server.ts +2 -2
  277. package/package.json +12 -1
  278. package/src/core/websocket-client.test.ts +8 -3
  279. package/src/core/websocket-client.ts +58 -4
  280. package/src/formatters/response-formatter.test.ts +2 -0
  281. package/src/formatters/response-formatter.ts +3 -3
  282. package/src/handlers/message-handlers/agent-details-response-handler.ts +42 -0
  283. package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +77 -0
  284. package/src/handlers/message-handlers/agent-status-update-handler.ts +52 -0
  285. package/src/handlers/message-handlers/all-agents-response-handler.ts +39 -0
  286. package/src/handlers/message-handlers/auth-message-handler.ts +78 -5
  287. package/src/handlers/message-handlers/auth-success-handler.ts +63 -6
  288. package/src/handlers/message-handlers/base-handler.ts +20 -7
  289. package/src/handlers/message-handlers/index.ts +53 -0
  290. package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
  291. package/src/handlers/message-handlers/list-room-agents-handler.ts +58 -0
  292. package/src/handlers/message-handlers/list-rooms-response-handler.ts +4 -2
  293. package/src/handlers/message-handlers/rate-limit-notification-handler.ts +45 -0
  294. package/src/handlers/message-handlers/regular-message-handler.ts +3 -2
  295. package/src/handlers/message-handlers/room-operation-response-handler.ts +102 -0
  296. package/src/handlers/message-handlers/subscribe-response-handler.ts +12 -2
  297. package/src/handlers/message-handlers/task-quote-handler.ts +31 -0
  298. package/src/handlers/message-handlers/types.ts +41 -7
  299. package/src/handlers/message-handlers/unsubscribe-response-handler.ts +12 -2
  300. package/src/handlers/message-handlers/user-authenticated-handler.ts +31 -0
  301. package/src/handlers/message-handlers/user-count-handler.ts +34 -0
  302. package/src/handlers/webhook-handler.test.ts +3 -2
  303. package/src/handlers/webhook-handler.ts +13 -7
  304. package/src/index.ts +21 -0
  305. package/src/managers/admin-manager.ts +249 -0
  306. package/src/managers/agent-registry.test.ts +2 -1
  307. package/src/managers/agent-registry.ts +170 -2
  308. package/src/managers/agent-room-manager.ts +665 -0
  309. package/src/managers/index.ts +15 -1
  310. package/src/managers/message-router.ts +215 -17
  311. package/src/managers/room-management-manager.ts +520 -0
  312. package/src/managers/room-manager.ts +15 -20
  313. package/src/payments/index.ts +22 -0
  314. package/src/payments/payment-client.ts +240 -0
  315. package/src/teneo-sdk.ts +806 -30
  316. package/src/types/categories.ts +45 -0
  317. package/src/types/config.ts +80 -7
  318. package/src/types/error-codes.ts +14 -0
  319. package/src/types/events.test.ts +1 -0
  320. package/src/types/events.ts +67 -0
  321. package/src/types/index.ts +111 -0
  322. package/src/types/messages.test.ts +2 -1
  323. package/src/types/messages.ts +677 -42
  324. package/src/utils/bounded-queue.test.ts +1 -1
  325. package/src/utils/bounded-queue.ts +2 -1
  326. package/src/utils/circuit-breaker.test.ts +1 -1
  327. package/src/utils/deduplication-cache.test.ts +1 -1
  328. package/src/utils/event-waiter.test.ts +1 -1
  329. package/src/utils/event-waiter.ts +3 -3
  330. package/src/utils/index.ts +7 -0
  331. package/src/utils/logger.ts +8 -8
  332. package/src/utils/pricing-resolver.ts +128 -0
  333. package/src/utils/rate-limiter.test.ts +1 -1
  334. package/src/utils/rate-limiter.ts +1 -0
  335. package/src/utils/signature-verifier.test.ts +2 -2
  336. package/src/utils/signature-verifier.ts +3 -2
  337. package/tests/.env.example +7 -0
  338. package/tests/direct-agent-test.ts +151 -0
  339. package/tests/integration/real-server.test.ts +2 -0
  340. package/tests/integration/room-management.test.ts +516 -0
  341. package/tests/integration/websocket.test.ts +5 -2
  342. package/tests/payment-flow-test.ts +147 -0
  343. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +382 -0
  344. package/tests/unit/handlers/agent-status-update-handler.test.ts +403 -0
  345. package/tests/unit/handlers/auth-success-handler-rooms.test.ts +697 -0
  346. package/tests/unit/handlers/list-available-agents-handler.test.ts +248 -0
  347. package/tests/unit/handlers/list-room-agents-handler.test.ts +290 -0
  348. package/tests/unit/handlers/room-operation-response-handler.test.ts +500 -0
  349. package/tests/unit/managers/agent-room-manager.test.ts +527 -0
  350. package/tests/unit/managers/room-management-manager.test.ts +420 -0
  351. package/tsconfig.json +2 -2
  352. package/vitest.config.ts +1 -0
@@ -0,0 +1,665 @@
1
+ /**
2
+ * AgentRoomManager - Manages agent-room associations (v2.0.0)
3
+ * Allows room owners to control which agents are available in their rooms
4
+ * Implements caching with 5-minute TTL and LRU eviction for performance
5
+ */
6
+
7
+ import { EventEmitter } from "eventemitter3";
8
+ import { WebSocketClient } from "../core/websocket-client";
9
+ import { Logger } from "../types";
10
+ import { SDKEvents, SDKError } from "../types/events";
11
+ import { ErrorCode } from "../types/error-codes";
12
+ import { RoomManagementManager } from "./room-management-manager";
13
+
14
+ // AgentRoomInfo from server response
15
+ export interface AgentRoomInfo {
16
+ agent_id: string;
17
+ agent_name?: string;
18
+ description?: string;
19
+ capabilities?: Array<{ name: string; description?: string }>;
20
+ commands?: Array<{ trigger: string; argument?: string; description?: string }>;
21
+ image?: string;
22
+ status?: string;
23
+ added_by?: string;
24
+ added_at?: string;
25
+ }
26
+
27
+ // Cache TTL: 5 minutes
28
+ const CACHE_TTL_MS = 5 * 60 * 1000;
29
+
30
+ // Maximum number of rooms to cache (LRU eviction beyond this)
31
+ const MAX_CACHED_ROOMS = 1000;
32
+
33
+ /**
34
+ * Simple LRU cache with TTL support
35
+ * Uses Map's insertion order for LRU tracking
36
+ */
37
+ class LRUCache<T> {
38
+ private readonly cache = new Map<string, T>();
39
+ private readonly timestamps = new Map<string, number>();
40
+ private readonly maxSize: number;
41
+ private readonly ttlMs: number;
42
+
43
+ constructor(maxSize: number, ttlMs: number) {
44
+ this.maxSize = maxSize;
45
+ this.ttlMs = ttlMs;
46
+ }
47
+
48
+ get(key: string): T | undefined {
49
+ const value = this.cache.get(key);
50
+ if (value === undefined) return undefined;
51
+
52
+ // Check TTL
53
+ const timestamp = this.timestamps.get(key);
54
+ if (timestamp && Date.now() - timestamp >= this.ttlMs) {
55
+ this.delete(key);
56
+ return undefined;
57
+ }
58
+
59
+ // Move to end (most recently used) by re-inserting
60
+ this.cache.delete(key);
61
+ this.cache.set(key, value);
62
+
63
+ return value;
64
+ }
65
+
66
+ set(key: string, value: T): void {
67
+ // Delete first to update insertion order
68
+ this.cache.delete(key);
69
+ this.timestamps.delete(key);
70
+
71
+ // Evict oldest entries if at capacity
72
+ while (this.cache.size >= this.maxSize) {
73
+ const oldestKey = this.cache.keys().next().value;
74
+ if (oldestKey !== undefined) {
75
+ this.cache.delete(oldestKey);
76
+ this.timestamps.delete(oldestKey);
77
+ }
78
+ }
79
+
80
+ this.cache.set(key, value);
81
+ this.timestamps.set(key, Date.now());
82
+ }
83
+
84
+ delete(key: string): void {
85
+ this.cache.delete(key);
86
+ this.timestamps.delete(key);
87
+ }
88
+
89
+ has(key: string): boolean {
90
+ return this.get(key) !== undefined;
91
+ }
92
+
93
+ isValid(key: string): boolean {
94
+ const timestamp = this.timestamps.get(key);
95
+ if (!timestamp) return false;
96
+ return Date.now() - timestamp < this.ttlMs;
97
+ }
98
+
99
+ clear(): void {
100
+ this.cache.clear();
101
+ this.timestamps.clear();
102
+ }
103
+
104
+ get size(): number {
105
+ return this.cache.size;
106
+ }
107
+ }
108
+
109
+ export class AgentRoomManager extends EventEmitter<SDKEvents> {
110
+ private readonly wsClient: WebSocketClient;
111
+ private readonly logger: Logger;
112
+ private readonly roomManagementManager: RoomManagementManager; // Reference to check ownership
113
+
114
+ // LRU caches with TTL (max 1000 rooms each)
115
+ private readonly roomAgentsCache = new LRUCache<AgentRoomInfo[]>(MAX_CACHED_ROOMS, CACHE_TTL_MS);
116
+ private readonly availableAgentsCache = new LRUCache<AgentRoomInfo[]>(
117
+ MAX_CACHED_ROOMS,
118
+ CACHE_TTL_MS
119
+ );
120
+
121
+ constructor(
122
+ wsClient: WebSocketClient,
123
+ logger: Logger,
124
+ roomManagementManager: RoomManagementManager
125
+ ) {
126
+ super();
127
+ this.wsClient = wsClient;
128
+ this.logger = logger;
129
+ this.roomManagementManager = roomManagementManager;
130
+ }
131
+
132
+ // ============================================================================
133
+ // AGENT ROOM OPERATIONS
134
+ // ============================================================================
135
+
136
+ /**
137
+ * Adds an agent to a room, making it available for interactions in that room.
138
+ * User must own the room to perform this operation.
139
+ *
140
+ * @param roomId - ID of the room to add agent to
141
+ * @param agentId - ID of the agent to add
142
+ * @returns Promise that resolves when agent is added
143
+ * @throws {SDKError} If not connected, not room owner, or operation fails
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * await sdk.addAgentToRoom('room-123', 'agent-456');
148
+ * console.log('Agent added to room');
149
+ * ```
150
+ */
151
+ public async addAgentToRoom(roomId: string, agentId: string): Promise<void> {
152
+ if (!this.wsClient.isConnected) {
153
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
154
+ }
155
+
156
+ // Validate inputs
157
+ this.validateRoomId(roomId);
158
+ this.validateAgentId(agentId);
159
+
160
+ // Verify room exists
161
+ if (!this.roomExists(roomId)) {
162
+ throw new SDKError("Room not found", ErrorCode.VALIDATION_ERROR);
163
+ }
164
+
165
+ // Verify user owns room
166
+ if (!this.verifyOwnership(roomId)) {
167
+ throw new SDKError(
168
+ "Cannot add agent to room: You don't own this room",
169
+ ErrorCode.PERMISSION_DENIED
170
+ );
171
+ }
172
+
173
+ this.logger.debug("AgentRoomManager: Adding agent to room", { roomId, agentId });
174
+
175
+ const message = {
176
+ type: "add_agent_to_room" as const,
177
+ data: {
178
+ room_id: roomId,
179
+ agent_id: agentId
180
+ }
181
+ };
182
+
183
+ return new Promise((resolve, reject) => {
184
+ const timeout = setTimeout(() => {
185
+ cleanup();
186
+ reject(new SDKError("Add agent to room timeout", ErrorCode.TIMEOUT));
187
+ }, 30000);
188
+
189
+ const onSuccess = (responseRoomId: string, responseAgentId: string) => {
190
+ if (responseRoomId === roomId && responseAgentId === agentId) {
191
+ cleanup();
192
+ // Invalidate caches for this room
193
+ this.invalidateRoomCaches(roomId);
194
+ resolve();
195
+ }
196
+ };
197
+
198
+ const onError = (error: Error, responseRoomId?: string) => {
199
+ if (!responseRoomId || responseRoomId === roomId) {
200
+ cleanup();
201
+ reject(error);
202
+ }
203
+ };
204
+
205
+ const cleanup = () => {
206
+ clearTimeout(timeout);
207
+ this.off("agent_room:agent_added", onSuccess);
208
+ this.off("agent_room:add_error", onError);
209
+ };
210
+
211
+ this.once("agent_room:agent_added", onSuccess);
212
+ this.once("agent_room:add_error", onError);
213
+
214
+ this.wsClient.sendMessage(message);
215
+ });
216
+ }
217
+
218
+ /**
219
+ * Removes an agent from a room.
220
+ * User must own the room to perform this operation.
221
+ *
222
+ * @param roomId - ID of the room to remove agent from
223
+ * @param agentId - ID of the agent to remove
224
+ * @returns Promise that resolves when agent is removed
225
+ * @throws {SDKError} If not connected, not room owner, or operation fails
226
+ *
227
+ * @example
228
+ * ```typescript
229
+ * await sdk.removeAgentFromRoom('room-123', 'agent-456');
230
+ * console.log('Agent removed from room');
231
+ * ```
232
+ */
233
+ public async removeAgentFromRoom(roomId: string, agentId: string): Promise<void> {
234
+ if (!this.wsClient.isConnected) {
235
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
236
+ }
237
+
238
+ // Validate inputs
239
+ this.validateRoomId(roomId);
240
+ this.validateAgentId(agentId);
241
+
242
+ // Verify user owns room
243
+ if (!this.verifyOwnership(roomId)) {
244
+ throw new SDKError(
245
+ "Cannot remove agent from room: You don't own this room",
246
+ ErrorCode.PERMISSION_DENIED
247
+ );
248
+ }
249
+
250
+ this.logger.debug("AgentRoomManager: Removing agent from room", { roomId, agentId });
251
+
252
+ const message = {
253
+ type: "remove_agent_from_room" as const,
254
+ data: {
255
+ room_id: roomId,
256
+ agent_id: agentId
257
+ }
258
+ };
259
+
260
+ return new Promise((resolve, reject) => {
261
+ const timeout = setTimeout(() => {
262
+ cleanup();
263
+ reject(new SDKError("Remove agent from room timeout", ErrorCode.TIMEOUT));
264
+ }, 30000);
265
+
266
+ const onSuccess = (responseRoomId: string, responseAgentId: string) => {
267
+ if (responseRoomId === roomId && responseAgentId === agentId) {
268
+ cleanup();
269
+ // Invalidate caches for this room
270
+ this.invalidateRoomCaches(roomId);
271
+ resolve();
272
+ }
273
+ };
274
+
275
+ const onError = (error: Error, responseRoomId?: string) => {
276
+ if (!responseRoomId || responseRoomId === roomId) {
277
+ cleanup();
278
+ reject(error);
279
+ }
280
+ };
281
+
282
+ const cleanup = () => {
283
+ clearTimeout(timeout);
284
+ this.off("agent_room:agent_removed", onSuccess);
285
+ this.off("agent_room:remove_error", onError);
286
+ };
287
+
288
+ this.once("agent_room:agent_removed", onSuccess);
289
+ this.once("agent_room:remove_error", onError);
290
+
291
+ this.wsClient.sendMessage(message);
292
+ });
293
+ }
294
+
295
+ /**
296
+ * Lists all agents currently in a room.
297
+ * Results are cached for 5 minutes for performance.
298
+ *
299
+ * @param roomId - ID of the room to list agents for
300
+ * @param useCache - Whether to use cached data (default: true)
301
+ * @returns Promise that resolves with array of agents
302
+ * @throws {SDKError} If not connected or operation fails
303
+ *
304
+ * @example
305
+ * ```typescript
306
+ * const agents = await sdk.listRoomAgents('room-123');
307
+ * console.log(`Room has ${agents.length} agents`);
308
+ *
309
+ * // Force fresh data
310
+ * const freshAgents = await sdk.listRoomAgents('room-123', false);
311
+ * ```
312
+ */
313
+ public async listRoomAgents(roomId: string, useCache: boolean = true): Promise<AgentRoomInfo[]> {
314
+ if (!this.wsClient.isConnected) {
315
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
316
+ }
317
+
318
+ // Validate input
319
+ this.validateRoomId(roomId);
320
+
321
+ // Check cache if enabled
322
+ if (useCache) {
323
+ const cached = this.roomAgentsCache.get(roomId);
324
+ if (cached) {
325
+ this.logger.debug("AgentRoomManager: Returning cached room agents", {
326
+ roomId,
327
+ count: cached.length
328
+ });
329
+ return cached.map((agent) => ({ ...agent })); // Return deep copy
330
+ }
331
+ }
332
+
333
+ this.logger.debug("AgentRoomManager: Listing room agents", { roomId });
334
+
335
+ const message = {
336
+ type: "list_room_agents" as const,
337
+ data: {
338
+ room_id: roomId
339
+ }
340
+ };
341
+
342
+ return new Promise((resolve, reject) => {
343
+ const timeout = setTimeout(() => {
344
+ cleanup();
345
+ reject(new SDKError("List room agents timeout", ErrorCode.TIMEOUT));
346
+ }, 30000);
347
+
348
+ const onSuccess = (responseRoomId: string, agents: AgentRoomInfo[]) => {
349
+ if (responseRoomId === roomId) {
350
+ cleanup();
351
+ resolve(agents);
352
+ }
353
+ };
354
+
355
+ const onError = (error: Error, responseRoomId?: string) => {
356
+ if (!responseRoomId || responseRoomId === roomId) {
357
+ cleanup();
358
+ reject(error);
359
+ }
360
+ };
361
+
362
+ const cleanup = () => {
363
+ clearTimeout(timeout);
364
+ this.off("agent_room:agents_listed", onSuccess);
365
+ this.off("agent_room:list_error", onError);
366
+ };
367
+
368
+ this.once("agent_room:agents_listed", onSuccess);
369
+ this.once("agent_room:list_error", onError);
370
+
371
+ this.wsClient.sendMessage(message);
372
+ });
373
+ }
374
+
375
+ /**
376
+ * Lists all agents available to add to a room (not yet in the room).
377
+ * Results are cached for 5 minutes for performance.
378
+ *
379
+ * @param roomId - ID of the room to check available agents for
380
+ * @param useCache - Whether to use cached data (default: true)
381
+ * @returns Promise that resolves with array of available agents
382
+ * @throws {SDKError} If not connected or operation fails
383
+ *
384
+ * @example
385
+ * ```typescript
386
+ * const availableAgents = await sdk.listAvailableAgents('room-123');
387
+ * console.log(`${availableAgents.length} agents can be added`);
388
+ * ```
389
+ */
390
+ public async listAvailableAgents(
391
+ roomId: string,
392
+ useCache: boolean = true
393
+ ): Promise<AgentRoomInfo[]> {
394
+ if (!this.wsClient.isConnected) {
395
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
396
+ }
397
+
398
+ // Validate input
399
+ this.validateRoomId(roomId);
400
+
401
+ // Check cache if enabled
402
+ if (useCache) {
403
+ const cached = this.availableAgentsCache.get(roomId);
404
+ if (cached) {
405
+ this.logger.debug("AgentRoomManager: Returning cached available agents", {
406
+ roomId,
407
+ count: cached.length
408
+ });
409
+ return cached.map((agent) => ({ ...agent })); // Return deep copy
410
+ }
411
+ }
412
+
413
+ this.logger.debug("AgentRoomManager: Listing available agents", { roomId });
414
+
415
+ const message = {
416
+ type: "list_available_agents" as const,
417
+ data: {
418
+ room_id: roomId
419
+ }
420
+ };
421
+
422
+ return new Promise((resolve, reject) => {
423
+ const timeout = setTimeout(() => {
424
+ cleanup();
425
+ reject(new SDKError("List available agents timeout", ErrorCode.TIMEOUT));
426
+ }, 30000);
427
+
428
+ const onSuccess = (agents: AgentRoomInfo[]) => {
429
+ cleanup();
430
+ resolve(agents);
431
+ };
432
+
433
+ const onError = (error: Error) => {
434
+ cleanup();
435
+ reject(error);
436
+ };
437
+
438
+ const cleanup = () => {
439
+ clearTimeout(timeout);
440
+ this.off("agent_room:available_agents_listed", onSuccess);
441
+ this.off("agent_room:list_available_error", onError);
442
+ };
443
+
444
+ this.once("agent_room:available_agents_listed", onSuccess);
445
+ this.once("agent_room:list_available_error", onError);
446
+
447
+ this.wsClient.sendMessage(message);
448
+ });
449
+ }
450
+
451
+ // ============================================================================
452
+ // QUERY METHODS (Synchronous, from cache)
453
+ // ============================================================================
454
+
455
+ /**
456
+ * Gets agents currently in a room from cache (synchronous).
457
+ * Returns undefined if not cached or cache expired.
458
+ *
459
+ * @param roomId - Room ID to query
460
+ * @returns Array of agents or undefined if not cached
461
+ *
462
+ * @example
463
+ * ```typescript
464
+ * const agents = sdk.getRoomAgents('room-123');
465
+ * if (agents) {
466
+ * console.log(`Found ${agents.length} agents in cache`);
467
+ * }
468
+ * ```
469
+ */
470
+ public getRoomAgents(roomId: string): AgentRoomInfo[] | undefined {
471
+ const cached = this.roomAgentsCache.get(roomId);
472
+ return cached ? cached.map((agent) => ({ ...agent })) : undefined;
473
+ }
474
+
475
+ /**
476
+ * Gets available agents for a room from cache (synchronous).
477
+ * Returns undefined if not cached or cache expired.
478
+ *
479
+ * @param roomId - Room ID to query
480
+ * @returns Array of available agents or undefined if not cached
481
+ *
482
+ * @example
483
+ * ```typescript
484
+ * const available = sdk.getAvailableAgents('room-123');
485
+ * if (available) {
486
+ * console.log(`${available.length} agents can be added`);
487
+ * }
488
+ * ```
489
+ */
490
+ public getAvailableAgents(roomId: string): AgentRoomInfo[] | undefined {
491
+ const cached = this.availableAgentsCache.get(roomId);
492
+ return cached ? cached.map((agent) => ({ ...agent })) : undefined;
493
+ }
494
+
495
+ /**
496
+ * Checks if an agent is currently in a room (from cache).
497
+ * Returns undefined if cache is invalid.
498
+ *
499
+ * @param roomId - Room ID to check
500
+ * @param agentId - Agent ID to check
501
+ * @returns True if agent in room, false if not, undefined if cache invalid
502
+ *
503
+ * @example
504
+ * ```typescript
505
+ * const isInRoom = sdk.isAgentInRoom('room-123', 'agent-456');
506
+ * if (isInRoom === true) {
507
+ * console.log('Agent is in this room');
508
+ * }
509
+ * ```
510
+ */
511
+ public isAgentInRoom(roomId: string, agentId: string): boolean | undefined {
512
+ const agents = this.getRoomAgents(roomId);
513
+ if (!agents) return undefined;
514
+ return agents.some((agent) => agent.agent_id === agentId);
515
+ }
516
+
517
+ /**
518
+ * Gets the count of agents in a room (from cache).
519
+ * Returns undefined if cache is invalid.
520
+ *
521
+ * @param roomId - Room ID to count agents for
522
+ * @returns Number of agents or undefined if cache invalid
523
+ *
524
+ * @example
525
+ * ```typescript
526
+ * const count = sdk.getRoomAgentCount('room-123');
527
+ * if (count !== undefined) {
528
+ * console.log(`Room has ${count} agents`);
529
+ * }
530
+ * ```
531
+ */
532
+ public getRoomAgentCount(roomId: string): number | undefined {
533
+ const agents = this.getRoomAgents(roomId);
534
+ return agents ? agents.length : undefined;
535
+ }
536
+
537
+ // ============================================================================
538
+ // CACHE MANAGEMENT (Public methods)
539
+ // ============================================================================
540
+
541
+ /**
542
+ * Manually invalidates all caches for a specific room.
543
+ * Useful after operations that might have changed agent assignments.
544
+ *
545
+ * @param roomId - Room ID to invalidate cache for
546
+ *
547
+ * @example
548
+ * ```typescript
549
+ * // After bulk operations
550
+ * sdk.invalidateCache('room-123');
551
+ * const freshAgents = await sdk.listRoomAgents('room-123', false);
552
+ * ```
553
+ */
554
+ public invalidateCache(roomId: string): void {
555
+ this.invalidateRoomCaches(roomId);
556
+ this.logger.debug("AgentRoomManager: Cache invalidated", { roomId });
557
+ }
558
+
559
+ /**
560
+ * Clears all caches for all rooms.
561
+ * Called automatically on disconnect.
562
+ * @internal
563
+ */
564
+ public clearAllCaches(): void {
565
+ this.roomAgentsCache.clear();
566
+ this.availableAgentsCache.clear();
567
+ this.logger.debug("AgentRoomManager: All caches cleared");
568
+ }
569
+
570
+ // ============================================================================
571
+ // INTERNAL METHODS
572
+ // ============================================================================
573
+
574
+ /**
575
+ * Handles agent status updates from server.
576
+ * Invalidates cache when agent status changes.
577
+ * @internal
578
+ */
579
+ public handleStatusUpdate(roomId: string, agentId: string, status: string): void {
580
+ this.logger.debug("AgentRoomManager: Agent status update", {
581
+ roomId,
582
+ agentId,
583
+ status
584
+ });
585
+
586
+ // Invalidate cache for this room as agent list may have changed
587
+ this.invalidateRoomCaches(roomId);
588
+ }
589
+
590
+ /**
591
+ * Called by handlers to cache room agents.
592
+ * @internal
593
+ */
594
+ public cacheRoomAgents(roomId: string, agents: AgentRoomInfo[]): void {
595
+ this.roomAgentsCache.set(roomId, agents);
596
+ this.logger.debug("AgentRoomManager: Cached room agents", {
597
+ roomId,
598
+ count: agents.length,
599
+ cacheSize: this.roomAgentsCache.size
600
+ });
601
+ }
602
+
603
+ /**
604
+ * Called by handlers to cache available agents.
605
+ * @internal
606
+ */
607
+ public cacheAvailableAgents(roomId: string, agents: AgentRoomInfo[]): void {
608
+ this.availableAgentsCache.set(roomId, agents);
609
+ this.logger.debug("AgentRoomManager: Cached available agents", {
610
+ roomId,
611
+ count: agents.length,
612
+ cacheSize: this.availableAgentsCache.size
613
+ });
614
+ }
615
+
616
+ // ============================================================================
617
+ // PRIVATE HELPERS
618
+ // ============================================================================
619
+
620
+ /**
621
+ * Invalidates all caches for a specific room
622
+ */
623
+ private invalidateRoomCaches(roomId: string): void {
624
+ this.roomAgentsCache.delete(roomId);
625
+ this.availableAgentsCache.delete(roomId);
626
+ }
627
+
628
+ /**
629
+ * Verifies user owns the room
630
+ */
631
+ private validateRoomId(roomId: string): void {
632
+ if (!roomId || roomId.trim() === "") {
633
+ throw new SDKError("Room ID cannot be empty", ErrorCode.VALIDATION_ERROR);
634
+ }
635
+ }
636
+
637
+ private validateAgentId(agentId: string): void {
638
+ if (!agentId || agentId.trim() === "") {
639
+ throw new SDKError("Agent ID cannot be empty", ErrorCode.VALIDATION_ERROR);
640
+ }
641
+ }
642
+
643
+ private roomExists(roomId: string): boolean {
644
+ if (!this.roomManagementManager) return true; // Skip check if manager not available
645
+
646
+ // If getRoomById method doesn't exist, skip check
647
+ if (typeof this.roomManagementManager.getRoomById !== "function") {
648
+ return true;
649
+ }
650
+
651
+ // Check if room exists (in owned or shared rooms)
652
+ const room = this.roomManagementManager.getRoomById(roomId);
653
+ return room !== undefined;
654
+ }
655
+
656
+ private verifyOwnership(roomId: string): boolean {
657
+ if (!this.roomManagementManager) return true; // Skip check if manager not available
658
+
659
+ // Check if room is in owned rooms
660
+ const ownedRooms = this.roomManagementManager.getOwnedRooms?.();
661
+ if (!ownedRooms) return true; // Skip check if method not available
662
+
663
+ return ownedRooms.some((room) => room.id === roomId);
664
+ }
665
+ }
@@ -5,5 +5,19 @@
5
5
 
6
6
  export { ConnectionManager } from "./connection-manager";
7
7
  export { RoomManager } from "./room-manager";
8
+ export { RoomManagementManager } from "./room-management-manager";
9
+ export { AgentRoomManager, type AgentRoomInfo } from "./agent-room-manager";
8
10
  export { AgentRegistry } from "./agent-registry";
9
- export { MessageRouter, type SendMessageOptions, type AgentCommand } from "./message-router";
11
+ export {
12
+ MessageRouter,
13
+ type SendMessageOptions,
14
+ type AgentCommand,
15
+ type QuoteResult,
16
+ type MessageRouterConfig
17
+ } from "./message-router";
18
+ export {
19
+ AdminManager,
20
+ type AdminManagerEvents,
21
+ type ListAllAgentsOptions,
22
+ type AllAgentsResult
23
+ } from "./admin-manager";