@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,520 @@
1
+ /**
2
+ * RoomManagementManager - Manages room CRUD operations (v2.0.0)
3
+ * Handles creating, updating, and deleting private rooms
4
+ * Tracks owned vs shared rooms with local caching
5
+ */
6
+
7
+ import { EventEmitter } from "eventemitter3";
8
+ import { WebSocketClient } from "../core/websocket-client";
9
+ import { RoomInfo, Logger } from "../types";
10
+ import { SDKEvents, SDKError } from "../types/events";
11
+ import { ErrorCode } from "../types/error-codes";
12
+
13
+ export interface CreateRoomOptions {
14
+ name: string;
15
+ description?: string;
16
+ }
17
+
18
+ export interface UpdateRoomOptions {
19
+ name?: string;
20
+ description?: string;
21
+ }
22
+
23
+ export class RoomManagementManager extends EventEmitter<SDKEvents> {
24
+ private readonly wsClient: WebSocketClient;
25
+ private readonly logger: Logger;
26
+
27
+ // Room caches
28
+ private readonly ownedRooms = new Map<string, RoomInfo>(); // Rooms user owns
29
+ private readonly sharedRooms = new Map<string, RoomInfo>(); // Rooms user is member of
30
+ private maxPrivateRooms: number = 1; // Default limit
31
+
32
+ constructor(wsClient: WebSocketClient, logger: Logger) {
33
+ super();
34
+ this.wsClient = wsClient;
35
+ this.logger = logger;
36
+ }
37
+
38
+ // ============================================================================
39
+ // ROOM CRUD OPERATIONS
40
+ // ============================================================================
41
+
42
+ /**
43
+ * Creates a new private room.
44
+ * Checks room limit before creating.
45
+ *
46
+ * @param options - Room creation options
47
+ * @returns Promise that resolves when room is created
48
+ * @throws {SDKError} If not connected, over limit, or validation fails
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * const room = await sdk.rooms.createRoom({
53
+ * name: 'My Private Room',
54
+ * description: 'A room for my project'
55
+ * });
56
+ * console.log(`Created room: ${room.id}`);
57
+ * ```
58
+ */
59
+ public async createRoom(options: CreateRoomOptions): Promise<RoomInfo> {
60
+ if (!this.wsClient.isConnected) {
61
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
62
+ }
63
+
64
+ // Validate inputs
65
+ this.validateRoomName(options.name);
66
+ if (options.description !== undefined) {
67
+ this.validateRoomDescription(options.description);
68
+ }
69
+
70
+ // Check room limit
71
+ if (!this.canCreateRoom()) {
72
+ throw new SDKError(
73
+ `Room limit reached. Maximum ${this.maxPrivateRooms} private rooms allowed.`,
74
+ ErrorCode.VALIDATION_ERROR
75
+ );
76
+ }
77
+
78
+ this.logger.debug("RoomManagementManager: Creating room", options);
79
+
80
+ // Send create_room message
81
+ const message = {
82
+ type: "create_room" as const,
83
+ data: {
84
+ name: options.name,
85
+ description: options.description
86
+ }
87
+ };
88
+
89
+ // Return promise that will be resolved by the response handler
90
+ return new Promise((resolve, reject) => {
91
+ const timeout = setTimeout(() => {
92
+ cleanup();
93
+ reject(new SDKError("Room creation timeout", ErrorCode.TIMEOUT));
94
+ }, 30000);
95
+
96
+ const onSuccess = (room: RoomInfo) => {
97
+ cleanup();
98
+ resolve(room);
99
+ };
100
+
101
+ const onError = (error: Error) => {
102
+ cleanup();
103
+ reject(error);
104
+ };
105
+
106
+ const cleanup = () => {
107
+ clearTimeout(timeout);
108
+ this.off("room:created", onSuccess);
109
+ this.off("room:create_error", onError);
110
+ };
111
+
112
+ this.once("room:created", onSuccess);
113
+ this.once("room:create_error", onError);
114
+
115
+ this.wsClient.sendMessage(message);
116
+ });
117
+ }
118
+
119
+ /**
120
+ * Updates an existing room's name and/or description.
121
+ * User must own the room to update it.
122
+ *
123
+ * @param roomId - ID of room to update
124
+ * @param updates - Fields to update
125
+ * @returns Promise that resolves when room is updated
126
+ * @throws {SDKError} If not connected, not owner, or validation fails
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * await sdk.rooms.updateRoom('room-123', {
131
+ * name: 'Updated Room Name',
132
+ * description: 'New description'
133
+ * });
134
+ * ```
135
+ */
136
+ public async updateRoom(roomId: string, updates: UpdateRoomOptions): Promise<RoomInfo> {
137
+ if (!this.wsClient.isConnected) {
138
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
139
+ }
140
+
141
+ // Verify user owns room
142
+ if (!this.ownedRooms.has(roomId)) {
143
+ throw new SDKError(
144
+ "Cannot update room: You don't own this room",
145
+ ErrorCode.PERMISSION_DENIED
146
+ );
147
+ }
148
+
149
+ // Validate at least one field is provided
150
+ if (updates.name === undefined && updates.description === undefined) {
151
+ throw new SDKError(
152
+ "At least one field (name or description) must be provided",
153
+ ErrorCode.VALIDATION_ERROR
154
+ );
155
+ }
156
+
157
+ // Validate inputs
158
+ if (updates.name !== undefined) {
159
+ this.validateRoomName(updates.name);
160
+ }
161
+ if (updates.description !== undefined) {
162
+ this.validateRoomDescription(updates.description);
163
+ }
164
+
165
+ this.logger.debug("RoomManagementManager: Updating room", { roomId, updates });
166
+
167
+ // Send update_room message
168
+ const message = {
169
+ type: "update_room" as const,
170
+ data: {
171
+ room_id: roomId,
172
+ name: updates.name,
173
+ description: updates.description
174
+ }
175
+ };
176
+
177
+ return new Promise((resolve, reject) => {
178
+ const timeout = setTimeout(() => {
179
+ cleanup();
180
+ reject(new SDKError("Room update timeout", ErrorCode.TIMEOUT));
181
+ }, 30000);
182
+
183
+ const onSuccess = (room: RoomInfo) => {
184
+ // Only resolve if it's the room we're updating
185
+ if (room.id === roomId) {
186
+ cleanup();
187
+ resolve(room);
188
+ }
189
+ };
190
+
191
+ const onError = (error: Error, responseRoomId?: string) => {
192
+ if (!responseRoomId || responseRoomId === roomId) {
193
+ cleanup();
194
+ reject(error);
195
+ }
196
+ };
197
+
198
+ const cleanup = () => {
199
+ clearTimeout(timeout);
200
+ this.off("room:updated", onSuccess);
201
+ this.off("room:update_error", onError);
202
+ };
203
+
204
+ this.once("room:updated", onSuccess);
205
+ this.once("room:update_error", onError);
206
+
207
+ this.wsClient.sendMessage(message);
208
+ });
209
+ }
210
+
211
+ /**
212
+ * Deletes a room permanently.
213
+ * User must own the room to delete it.
214
+ *
215
+ * @param roomId - ID of room to delete
216
+ * @returns Promise that resolves when room is deleted
217
+ * @throws {SDKError} If not connected or not owner
218
+ *
219
+ * @example
220
+ * ```typescript
221
+ * await sdk.rooms.deleteRoom('room-123');
222
+ * console.log('Room deleted successfully');
223
+ * ```
224
+ */
225
+ public async deleteRoom(roomId: string): Promise<void> {
226
+ if (!this.wsClient.isConnected) {
227
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
228
+ }
229
+
230
+ // Verify user owns room
231
+ if (!this.ownedRooms.has(roomId)) {
232
+ throw new SDKError(
233
+ "Cannot delete room: You don't own this room",
234
+ ErrorCode.PERMISSION_DENIED
235
+ );
236
+ }
237
+
238
+ this.logger.debug("RoomManagementManager: Deleting room", { roomId });
239
+
240
+ // Send delete_room message
241
+ const message = {
242
+ type: "delete_room" as const,
243
+ data: {
244
+ room_id: roomId
245
+ }
246
+ };
247
+
248
+ return new Promise((resolve, reject) => {
249
+ const timeout = setTimeout(() => {
250
+ cleanup();
251
+ reject(new SDKError("Room deletion timeout", ErrorCode.TIMEOUT));
252
+ }, 30000);
253
+
254
+ const onSuccess = (deletedRoomId: string) => {
255
+ if (deletedRoomId === roomId) {
256
+ cleanup();
257
+ resolve();
258
+ }
259
+ };
260
+
261
+ const onError = (error: Error, responseRoomId?: string) => {
262
+ if (!responseRoomId || responseRoomId === roomId) {
263
+ cleanup();
264
+ reject(error);
265
+ }
266
+ };
267
+
268
+ const cleanup = () => {
269
+ clearTimeout(timeout);
270
+ this.off("room:deleted", onSuccess);
271
+ this.off("room:delete_error", onError);
272
+ };
273
+
274
+ this.once("room:deleted", onSuccess);
275
+ this.once("room:delete_error", onError);
276
+
277
+ this.wsClient.sendMessage(message);
278
+ });
279
+ }
280
+
281
+ // ============================================================================
282
+ // QUERY METHODS (Synchronous, from cache)
283
+ // ============================================================================
284
+
285
+ /**
286
+ * Gets all rooms owned by the current user.
287
+ * Synchronous method that returns cached data.
288
+ *
289
+ * @returns Array of owned room info
290
+ *
291
+ * @example
292
+ * ```typescript
293
+ * const myRooms = sdk.rooms.getOwnedRooms();
294
+ * console.log(`I own ${myRooms.length} rooms`);
295
+ * ```
296
+ */
297
+ public getOwnedRooms(): ReadonlyArray<Readonly<RoomInfo>> {
298
+ return Array.from(this.ownedRooms.values()).map((room) => ({ ...room }));
299
+ }
300
+
301
+ /**
302
+ * Gets all rooms the user is a member of (but doesn't own).
303
+ * Synchronous method that returns cached data.
304
+ *
305
+ * @returns Array of shared room info
306
+ *
307
+ * @example
308
+ * ```typescript
309
+ * const sharedRooms = sdk.rooms.getSharedRooms();
310
+ * console.log(`I'm a member of ${sharedRooms.length} shared rooms`);
311
+ * ```
312
+ */
313
+ public getSharedRooms(): ReadonlyArray<Readonly<RoomInfo>> {
314
+ return Array.from(this.sharedRooms.values()).map((room) => ({ ...room }));
315
+ }
316
+
317
+ /**
318
+ * Gets all rooms the user has access to (both owned and shared).
319
+ * Convenience method that combines getOwnedRooms() and getSharedRooms().
320
+ * Synchronous method that returns cached data.
321
+ *
322
+ * @returns Array of all room info (owned + shared)
323
+ *
324
+ * @example
325
+ * ```typescript
326
+ * const allRooms = sdk.getAllRooms();
327
+ * console.log(`I have access to ${allRooms.length} total rooms`);
328
+ *
329
+ * // Filter by ownership if needed
330
+ * const myRooms = allRooms.filter(r => r.is_owner);
331
+ * const sharedWithMe = allRooms.filter(r => !r.is_owner);
332
+ * ```
333
+ */
334
+ public getAllRooms(): ReadonlyArray<Readonly<RoomInfo>> {
335
+ return [...this.getOwnedRooms(), ...this.getSharedRooms()];
336
+ }
337
+
338
+ /**
339
+ * Gets a specific room by ID.
340
+ * Checks both owned and shared room caches.
341
+ *
342
+ * @param roomId - Room ID to look up
343
+ * @returns Room info if found, undefined otherwise
344
+ *
345
+ * @example
346
+ * ```typescript
347
+ * const room = sdk.rooms.getRoomById('room-123');
348
+ * if (room) {
349
+ * console.log(`Room: ${room.name}`);
350
+ * }
351
+ * ```
352
+ */
353
+ public getRoomById(roomId: string): Readonly<RoomInfo> | undefined {
354
+ const owned = this.ownedRooms.get(roomId);
355
+ if (owned) return { ...owned };
356
+
357
+ const shared = this.sharedRooms.get(roomId);
358
+ if (shared) return { ...shared };
359
+
360
+ return undefined;
361
+ }
362
+
363
+ /**
364
+ * Gets the maximum number of private rooms the user can create.
365
+ * Based on user's subscription/plan.
366
+ *
367
+ * @returns Maximum private room limit
368
+ *
369
+ * @example
370
+ * ```typescript
371
+ * const limit = sdk.rooms.getRoomLimit();
372
+ * console.log(`You can create up to ${limit} private rooms`);
373
+ * ```
374
+ */
375
+ public getRoomLimit(): number {
376
+ return this.maxPrivateRooms;
377
+ }
378
+
379
+ /**
380
+ * Checks if user can create another private room.
381
+ * Compares current owned room count against limit.
382
+ *
383
+ * @returns True if under limit, false otherwise
384
+ *
385
+ * @example
386
+ * ```typescript
387
+ * if (sdk.rooms.canCreateRoom()) {
388
+ * await sdk.rooms.createRoom({ name: 'New Room' });
389
+ * } else {
390
+ * console.log('Room limit reached!');
391
+ * }
392
+ * ```
393
+ */
394
+ public canCreateRoom(): boolean {
395
+ return this.ownedRooms.size < this.maxPrivateRooms;
396
+ }
397
+
398
+ /**
399
+ * Gets the current count of owned private rooms.
400
+ *
401
+ * @returns Number of rooms user owns
402
+ *
403
+ * @example
404
+ * ```typescript
405
+ * const count = sdk.rooms.getOwnedRoomCount();
406
+ * const limit = sdk.rooms.getRoomLimit();
407
+ * console.log(`Using ${count}/${limit} room slots`);
408
+ * ```
409
+ */
410
+ public getOwnedRoomCount(): number {
411
+ return this.ownedRooms.size;
412
+ }
413
+
414
+ // ============================================================================
415
+ // INTERNAL METHODS (Called by SDK internals)
416
+ // ============================================================================
417
+
418
+ /**
419
+ * Sets the room limit from auth response.
420
+ * @internal
421
+ */
422
+ public setRoomLimit(limit: number): void {
423
+ this.maxPrivateRooms = limit;
424
+ this.logger.debug("RoomManagementManager: Room limit set", { limit });
425
+ }
426
+
427
+ /**
428
+ * Initializes owned rooms cache from auth response.
429
+ * @internal
430
+ */
431
+ public setOwnedRooms(rooms: RoomInfo[]): void {
432
+ this.ownedRooms.clear();
433
+ for (const room of rooms) {
434
+ this.ownedRooms.set(room.id, room);
435
+ }
436
+ this.logger.debug("RoomManagementManager: Owned rooms set", { count: rooms.length });
437
+ }
438
+
439
+ /**
440
+ * Initializes shared rooms cache from auth response.
441
+ * @internal
442
+ */
443
+ public setSharedRooms(rooms: RoomInfo[]): void {
444
+ this.sharedRooms.clear();
445
+ for (const room of rooms) {
446
+ this.sharedRooms.set(room.id, room);
447
+ }
448
+ this.logger.debug("RoomManagementManager: Shared rooms set", { count: rooms.length });
449
+ }
450
+
451
+ /**
452
+ * Adds or updates a room in the appropriate cache.
453
+ * Determines owned vs shared based on is_owner flag.
454
+ * @internal
455
+ */
456
+ public upsertRoom(room: RoomInfo): void {
457
+ if (room.is_owner) {
458
+ this.ownedRooms.set(room.id, room);
459
+ // Remove from shared if it was there
460
+ this.sharedRooms.delete(room.id);
461
+ this.logger.debug("RoomManagementManager: Upserted owned room", { roomId: room.id });
462
+ } else {
463
+ this.sharedRooms.set(room.id, room);
464
+ // Remove from owned if it was there
465
+ this.ownedRooms.delete(room.id);
466
+ this.logger.debug("RoomManagementManager: Upserted shared room", { roomId: room.id });
467
+ }
468
+ }
469
+
470
+ /**
471
+ * Removes a room from cache.
472
+ * Checks both owned and shared caches.
473
+ * @internal
474
+ */
475
+ public removeRoom(roomId: string): void {
476
+ const wasOwned = this.ownedRooms.delete(roomId);
477
+ const wasShared = this.sharedRooms.delete(roomId);
478
+
479
+ if (wasOwned || wasShared) {
480
+ this.logger.debug("RoomManagementManager: Removed room", {
481
+ roomId,
482
+ wasOwned,
483
+ wasShared
484
+ });
485
+ }
486
+ }
487
+
488
+ /**
489
+ * Clears all caches. Called on disconnect.
490
+ * @internal
491
+ */
492
+ public clearCaches(): void {
493
+ this.ownedRooms.clear();
494
+ this.sharedRooms.clear();
495
+ this.maxPrivateRooms = 1;
496
+ this.logger.debug("RoomManagementManager: Caches cleared");
497
+ }
498
+
499
+ // ============================================================================
500
+ // VALIDATION
501
+ // ============================================================================
502
+
503
+ private validateRoomName(name: string): void {
504
+ if (!name || name.trim().length === 0) {
505
+ throw new SDKError("Room name cannot be empty", ErrorCode.VALIDATION_ERROR);
506
+ }
507
+ if (name.length > 100) {
508
+ throw new SDKError("Room name too long (max 100 characters)", ErrorCode.VALIDATION_ERROR);
509
+ }
510
+ }
511
+
512
+ private validateRoomDescription(description: string): void {
513
+ if (description.length > 500) {
514
+ throw new SDKError(
515
+ "Room description too long (max 500 characters)",
516
+ ErrorCode.VALIDATION_ERROR
517
+ );
518
+ }
519
+ }
520
+ }
@@ -5,14 +5,7 @@
5
5
 
6
6
  import { EventEmitter } from "eventemitter3";
7
7
  import { WebSocketClient } from "../core/websocket-client";
8
- import {
9
- Room,
10
- createSubscribe,
11
- createUnsubscribe,
12
- createListRooms,
13
- Logger,
14
- RoomInfo
15
- } from "../types";
8
+ import { createSubscribe, createUnsubscribe, createListRooms, Logger, RoomInfo } from "../types";
16
9
  import { SDKEvents, SDKError } from "../types/events";
17
10
  import { ErrorCode } from "../types/error-codes";
18
11
  import { RoomIdSchema } from "../types/validation";
@@ -20,7 +13,7 @@ import { RoomIdSchema } from "../types/validation";
20
13
  export class RoomManager extends EventEmitter<SDKEvents> {
21
14
  private readonly wsClient: WebSocketClient;
22
15
  private readonly logger: Logger;
23
- private readonly rooms = new Map<string, Room>();
16
+ private readonly rooms = new Map<string, RoomInfo>();
24
17
  private readonly subscribedRooms = new Set<string>();
25
18
 
26
19
  constructor(wsClient: WebSocketClient, logger: Logger) {
@@ -30,7 +23,7 @@ export class RoomManager extends EventEmitter<SDKEvents> {
30
23
  }
31
24
 
32
25
  /**
33
- * Subscribes to a public room in the Teneo network.
26
+ * Subscribes to a public room in the Teneo Protocol.
34
27
  * Validates room ID and sends subscribe message to the server.
35
28
  * The actual subscription state is updated when the server confirms via room:subscribed event.
36
29
  *
@@ -47,7 +40,7 @@ export class RoomManager extends EventEmitter<SDKEvents> {
47
40
  */
48
41
  public async subscribeToRoom(roomId: string): Promise<void> {
49
42
  if (!this.wsClient.isConnected) {
50
- throw new SDKError("Not connected to Teneo network", ErrorCode.NOT_CONNECTED);
43
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
51
44
  }
52
45
 
53
46
  // Validate room ID
@@ -60,24 +53,26 @@ export class RoomManager extends EventEmitter<SDKEvents> {
60
53
  }
61
54
 
62
55
  /**
63
- * Unsubscribes from a room in the Teneo network.
56
+ * Unsubscribes from a public room in the Teneo Protocol.
64
57
  * Validates room ID and sends unsubscribe message to the server.
65
58
  * The actual subscription state is updated when the server confirms via room:unsubscribed event.
66
59
  *
67
- * @param roomId - The ID of the room to unsubscribe from
60
+ * Note: This only applies to public rooms. Private rooms cannot be unsubscribed from.
61
+ *
62
+ * @param roomId - The ID of the public room to unsubscribe from
68
63
  * @returns Promise that resolves when unsubscribed
69
64
  * @throws {SDKError} If not connected to the network
70
65
  * @throws {ValidationError} If roomId is empty or invalid
71
66
  *
72
67
  * @example
73
68
  * ```typescript
74
- * await roomManager.unsubscribeFromRoom('general');
75
- * console.log('Unsubscription request sent for general room');
69
+ * await roomManager.unsubscribeFromRoom('public-announcements');
70
+ * console.log('Unsubscription request sent for public room');
76
71
  * ```
77
72
  */
78
73
  public async unsubscribeFromRoom(roomId: string): Promise<void> {
79
74
  if (!this.wsClient.isConnected) {
80
- throw new SDKError("Not connected to Teneo network", ErrorCode.NOT_CONNECTED);
75
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
81
76
  }
82
77
 
83
78
  // Validate room ID
@@ -141,7 +136,7 @@ export class RoomManager extends EventEmitter<SDKEvents> {
141
136
  * rooms.forEach(room => console.log(`${room.id}: ${room.name}`));
142
137
  * ```
143
138
  */
144
- public getRooms(): ReadonlyArray<Readonly<Room>> {
139
+ public getRooms(): ReadonlyArray<Readonly<RoomInfo>> {
145
140
  return Array.from(this.rooms.values()).map((room) => ({ ...room }));
146
141
  }
147
142
 
@@ -162,7 +157,7 @@ export class RoomManager extends EventEmitter<SDKEvents> {
162
157
  * }
163
158
  * ```
164
159
  */
165
- public getRoom(roomId: string): Readonly<Room> | undefined {
160
+ public getRoom(roomId: string): Readonly<RoomInfo> | undefined {
166
161
  const room = this.rooms.get(roomId);
167
162
  return room ? { ...room } : undefined;
168
163
  }
@@ -186,7 +181,7 @@ export class RoomManager extends EventEmitter<SDKEvents> {
186
181
  */
187
182
  public async listRooms(): Promise<RoomInfo[]> {
188
183
  if (!this.wsClient.isConnected) {
189
- throw new SDKError("Not connected to Teneo network", ErrorCode.NOT_CONNECTED);
184
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
190
185
  }
191
186
 
192
187
  this.logger.info("RoomManager: Listing rooms");
@@ -213,7 +208,7 @@ export class RoomManager extends EventEmitter<SDKEvents> {
213
208
  * roomManager.updateRoomsFromAuth(authState.roomObjects);
214
209
  * ```
215
210
  */
216
- public updateRoomsFromAuth(rooms: Room[]): void {
211
+ public updateRoomsFromAuth(rooms: RoomInfo[]): void {
217
212
  this.logger.debug("RoomManager: Updating rooms from auth", { count: rooms.length });
218
213
 
219
214
  for (const room of rooms) {
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Payment module exports for quote-approve flow (v2.2.0)
3
+ */
4
+
5
+ export {
6
+ PaymentClient,
7
+ type PaymentClientConfig,
8
+ // Constants
9
+ USDC_CONTRACT,
10
+ PEAQ_CHAIN_ID,
11
+ USDC_DECIMALS,
12
+ X402_VERSION,
13
+ DEFAULT_PAYMENT_TIMEOUT_SECONDS,
14
+ DEFAULT_PAY_TO_ADDRESS,
15
+ DEFAULT_RPC_URL,
16
+ // Utilities
17
+ buildX402ResourceUrl,
18
+ usdcToUnits,
19
+ unitsToUsdc,
20
+ // Types
21
+ type SupportedChain
22
+ } from "./payment-client";