@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
package/src/teneo-sdk.ts CHANGED
@@ -6,6 +6,7 @@
6
6
 
7
7
  import { EventEmitter } from "eventemitter3";
8
8
  import { z } from "zod";
9
+ import { privateKeyToAccount } from "viem/accounts";
9
10
  import {
10
11
  SDKConfig,
11
12
  PartialSDKConfig,
@@ -17,6 +18,7 @@ import {
17
18
  validateConfig,
18
19
  DEFAULT_CONFIG,
19
20
  ResponseFormatSchema,
21
+ AgentRoomInfo,
20
22
  type HealthStatus
21
23
  } from "./types";
22
24
  import { SDKEvents, SDKError } from "./types/events";
@@ -36,13 +38,24 @@ import {
36
38
  AgentRegistry,
37
39
  MessageRouter,
38
40
  SendMessageOptions,
39
- AgentCommand
41
+ AgentCommand,
42
+ QuoteResult,
43
+ AdminManager,
44
+ ListAllAgentsOptions,
45
+ AllAgentsResult
40
46
  } from "./managers";
41
47
  import { createPinoLogger } from "./utils/logger";
42
48
  import { RoomIdSchema, AgentIdSchema, AgentCommandContentSchema } from "./types/validation";
49
+ import { SecurePrivateKey } from "./utils/secure-private-key";
43
50
 
44
51
  // Re-export types for external use
45
- export type { SendMessageOptions, AgentCommand };
52
+ export type {
53
+ SendMessageOptions,
54
+ AgentCommand,
55
+ QuoteResult,
56
+ ListAllAgentsOptions,
57
+ AllAgentsResult
58
+ };
46
59
 
47
60
  // Zod schemas for SDK-specific interfaces
48
61
  export const SendMessageOptionsSchema = z.object({
@@ -63,6 +76,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
63
76
  private config: SDKConfig;
64
77
  private readonly logger: Logger;
65
78
  private isDestroyed = false;
79
+ private secureKey?: SecurePrivateKey;
66
80
 
67
81
  // Core components
68
82
  private readonly wsClient: WebSocketClient;
@@ -76,6 +90,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
76
90
  private readonly agentRoom: AgentRoomManager;
77
91
  private readonly agents: AgentRegistry;
78
92
  private readonly messages: MessageRouter;
93
+ private readonly _admin: AdminManager;
79
94
 
80
95
  /**
81
96
  * Creates a new instance of the Teneo Protocol SDK.
@@ -141,6 +156,15 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
141
156
  // Initialize logger
142
157
  this.logger = this.config.logger ?? this.createDefaultLogger();
143
158
 
159
+ // Store secure key for payment client
160
+ if (config.privateKey) {
161
+ if (typeof config.privateKey === "object" && "use" in config.privateKey) {
162
+ this.secureKey = config.privateKey;
163
+ } else {
164
+ this.secureKey = new SecurePrivateKey(config.privateKey as string);
165
+ }
166
+ }
167
+
144
168
  // Initialize core components
145
169
  this.wsClient = new WebSocketClient(this.config);
146
170
  this.webhookHandler = new WebhookHandler(this.config, this.logger);
@@ -158,6 +182,10 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
158
182
  this.wsClient.setRoomManagementManager(this.roomManagement); // Enable room CRUD in handlers (v2.0.0)
159
183
  this.wsClient.setAgentRoomManager(this.agentRoom); // Enable agent-room operations in handlers (v2.0.0)
160
184
  this.agents = new AgentRegistry(this.logger);
185
+ this.agents.setWebSocketClient(this.wsClient); // Enable getAgentDetails requests
186
+ this._admin = new AdminManager(this.wsClient, this.logger);
187
+ this.wsClient.setAdminManager(this._admin); // Enable admin handlers
188
+ this.wsClient.setAgentRegistry(this.agents); // Enable agent details handler
161
189
  this.messages = new MessageRouter(
162
190
  this.wsClient,
163
191
  this.webhookHandler,
@@ -165,10 +193,27 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
165
193
  this.logger,
166
194
  {
167
195
  messageTimeout: this.config.messageTimeout,
168
- responseFormat: this.config.responseFormat
196
+ responseFormat: this.config.responseFormat,
197
+ autoApproveQuotes: this.config.autoApproveQuotes,
198
+ maxPricePerRequest: this.config.maxPricePerRequest,
199
+ quoteTimeout: this.config.quoteTimeout,
200
+ wsUrl: this.config.wsUrl,
201
+ paymentNetwork: this.config.paymentNetwork,
202
+ paymentAsset: this.config.paymentAsset
169
203
  }
170
204
  );
171
205
 
206
+ // Set up payment client if private key is configured (v2.2.0)
207
+ if (this.config.privateKey) {
208
+ const secureKey =
209
+ this.config.privateKey instanceof SecurePrivateKey
210
+ ? this.config.privateKey
211
+ : new SecurePrivateKey(this.config.privateKey);
212
+ const walletAddress =
213
+ this.config.walletAddress || this.deriveWalletAddress(this.config.privateKey);
214
+ this.messages.setPaymentClient(secureKey, walletAddress);
215
+ }
216
+
172
217
  // Set up event forwarding
173
218
  this.setupEventForwarding();
174
219
 
@@ -182,7 +227,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
182
227
  }
183
228
 
184
229
  /**
185
- * Establishes a connection to the Teneo network via WebSocket.
230
+ * Establishes a connection to the Teneo Protocol via WebSocket.
186
231
  * Handles authentication automatically and joins any configured auto-join rooms.
187
232
  * Emits 'connection:open', 'auth:success', and 'ready' events on successful connection.
188
233
  *
@@ -195,7 +240,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
195
240
  * ```typescript
196
241
  * const sdk = new TeneoSDK({ wsUrl: 'wss://example.com', privateKey: '0x...' });
197
242
  * await sdk.connect();
198
- * console.log('Connected to Teneo network');
243
+ * console.log('Connected to Teneo Protocol');
199
244
  * ```
200
245
  */
201
246
  public async connect(): Promise<void> {
@@ -204,7 +249,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
204
249
  }
205
250
 
206
251
  try {
207
- this.logger.info("Connecting to Teneo network");
252
+ this.logger.info("Connecting to Teneo Protocol");
208
253
  await this.connection.connect();
209
254
 
210
255
  // Auto-join rooms if configured
@@ -214,26 +259,26 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
214
259
  }
215
260
  }
216
261
 
217
- this.logger.info("Successfully connected to Teneo network");
262
+ this.logger.info("Successfully connected to Teneo Protocol");
218
263
  } catch (error) {
219
- this.logger.error("Failed to connect to Teneo network", error);
264
+ this.logger.error("Failed to connect to Teneo Protocol", error);
220
265
  throw error;
221
266
  }
222
267
  }
223
268
 
224
269
  /**
225
- * Disconnects from the Teneo network and cleans up all active connections.
270
+ * Disconnects from the Teneo Protocol and cleans up all active connections.
226
271
  * Clears all timers, pending messages, and stops automatic reconnection attempts.
227
272
  * Emits 'disconnect' event after disconnection is complete.
228
273
  *
229
274
  * @example
230
275
  * ```typescript
231
276
  * sdk.disconnect();
232
- * console.log('Disconnected from Teneo network');
277
+ * console.log('Disconnected from Teneo Protocol');
233
278
  * ```
234
279
  */
235
280
  public disconnect(): void {
236
- this.logger.info("Disconnecting from Teneo network");
281
+ this.logger.info("Disconnecting from Teneo Protocol");
237
282
  this.connection.disconnect();
238
283
  }
239
284
 
@@ -305,19 +350,49 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
305
350
  }
306
351
 
307
352
  /**
308
- * Subscribes to a specified room in the Teneo network.
309
- * Agents in the room will be able to see and respond to your messages.
353
+ * Requests a quote for a task from the coordinator.
354
+ * The quote includes agent selection, pricing, and expiration.
355
+ * Does NOT auto-approve - use confirmQuote() to execute.
356
+ */
357
+ public async requestQuote(content: string, room: string): Promise<QuoteResult> {
358
+ return this.messages.requestQuote(content, room);
359
+ }
360
+
361
+ /**
362
+ * Confirms a pending quote and executes the task with payment.
363
+ * Attaches x402 payment header if payment client is configured.
364
+ */
365
+ public async confirmQuote(
366
+ taskId: string,
367
+ options?: { waitForResponse?: boolean; timeout?: number }
368
+ ): Promise<FormattedResponse | void> {
369
+ return this.messages.confirmQuote(taskId, options);
370
+ }
371
+
372
+ /**
373
+ * Gets a pending quote by task ID.
374
+ */
375
+ public getPendingQuote(taskId: string): QuoteResult | undefined {
376
+ return this.messages.getPendingQuote(taskId);
377
+ }
378
+
379
+ /**
380
+ * Subscribes to a public room in the Teneo Protocol.
381
+ * This is only needed for public rooms - private rooms are automatically subscribed.
310
382
  * Emits 'room:subscribed' event when successfully subscribed.
311
383
  *
312
- * @param roomId - The ID of the room to subscribe to
384
+ * @param roomId - The ID of the public room to subscribe to
313
385
  * @returns Promise that resolves when the room has been subscribed
314
386
  * @throws {SDKError} If not connected to the network (ErrorCode.NOT_CONNECTED)
315
387
  * @throws {ValidationError} If roomId is empty or invalid
316
388
  *
317
389
  * @example
318
390
  * ```typescript
319
- * await sdk.subscribeToRoom('general');
320
- * console.log('Subscribed to general room');
391
+ * // Subscribe to a public room
392
+ * await sdk.subscribeToRoom('public-announcements');
393
+ * console.log('Subscribed to public room');
394
+ *
395
+ * // Note: Private rooms don't need subscription - you're always subscribed
321
396
  * ```
322
397
  */
323
398
  public async subscribeToRoom(roomId: string): Promise<void> {
@@ -325,19 +400,21 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
325
400
  }
326
401
 
327
402
  /**
328
- * Unsubscribes from a specified room in the Teneo network.
329
- * You will no longer receive messages from agents in this room.
403
+ * Unsubscribes from a public room in the Teneo Protocol.
404
+ * You will no longer receive messages from this public room.
330
405
  * Emits 'room:unsubscribed' event when successfully unsubscribed.
331
406
  *
332
- * @param roomId - The ID of the room to unsubscribe from
407
+ * Note: This only applies to public rooms. Private rooms cannot be unsubscribed from.
408
+ *
409
+ * @param roomId - The ID of the public room to unsubscribe from
333
410
  * @returns Promise that resolves when the room has been unsubscribed
334
411
  * @throws {SDKError} If not connected to the network (ErrorCode.NOT_CONNECTED)
335
412
  * @throws {ValidationError} If roomId is empty or invalid
336
413
  *
337
414
  * @example
338
415
  * ```typescript
339
- * await sdk.unsubscribeFromRoom('general');
340
- * console.log('Unsubscribed from general room');
416
+ * await sdk.unsubscribeFromRoom('public-announcements');
417
+ * console.log('Unsubscribed from public room');
341
418
  * ```
342
419
  */
343
420
  public async unsubscribeFromRoom(roomId: string): Promise<void> {
@@ -383,7 +460,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
383
460
  }
384
461
 
385
462
  /**
386
- * Gets a list of all available agents in the Teneo network.
463
+ * Gets a list of all available agents in the Teneo Protocol.
387
464
  * The list is automatically updated when new agents join or leave.
388
465
  * Returns a read-only array to prevent external modification.
389
466
  *
@@ -493,7 +570,84 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
493
570
  }
494
571
 
495
572
  /**
496
- * Gets a list of all available rooms in the Teneo network.
573
+ * Fetches detailed information about a specific agent from the server.
574
+ * Makes a request to the server for full agent details including capabilities,
575
+ * commands, pricing, and more.
576
+ *
577
+ * @param agentId - The unique identifier of the agent
578
+ * @returns Promise that resolves with full agent details
579
+ * @throws {SDKError} If not connected or request times out
580
+ * @throws {ValidationError} If agentId is invalid
581
+ *
582
+ * @example
583
+ * ```typescript
584
+ * const details = await sdk.getAgentDetails('weather-agent-001');
585
+ * console.log(`Agent: ${details.agent_name}`);
586
+ * console.log(`Capabilities: ${details.capabilities?.length}`);
587
+ * console.log(`Status: ${details.status}`);
588
+ * ```
589
+ */
590
+ public async getAgentDetails(agentId: string): Promise<AgentRoomInfo> {
591
+ return this.agents.getAgentDetails(agentId);
592
+ }
593
+
594
+ // ============================================================================
595
+ // ADMIN API (Admin-Only Features)
596
+ // ============================================================================
597
+
598
+ /**
599
+ * Gets the admin manager for admin-only features.
600
+ * Returns undefined if the current user is not an admin.
601
+ * Use this to access admin APIs like listing all agents, user counts, etc.
602
+ *
603
+ * @returns The AdminManager instance if user is admin, undefined otherwise
604
+ *
605
+ * @example
606
+ * ```typescript
607
+ * if (sdk.admin?.isAdmin) {
608
+ * // List all agents in the network
609
+ * const result = await sdk.admin.listAllAgents({ limit: 20 });
610
+ * console.log(`Found ${result.total} agents`);
611
+ *
612
+ * result.agents.forEach(agent => {
613
+ * console.log(`${agent.agent_name}: verified=${agent.is_verified}, banned=${agent.is_banned}`);
614
+ * });
615
+ *
616
+ * // Get user count
617
+ * const userCount = sdk.admin.getLastUserCount();
618
+ * console.log(`Online users: ${userCount?.count}`);
619
+ *
620
+ * // Listen for user count updates
621
+ * sdk.admin.on('user_count', (data) => {
622
+ * console.log(`User count updated: ${data.count}`);
623
+ * });
624
+ * }
625
+ * ```
626
+ */
627
+ public get admin(): AdminManager | undefined {
628
+ return this._admin.isAdmin ? this._admin : undefined;
629
+ }
630
+
631
+ /**
632
+ * Lists all agents in the network (admin only, convenience method).
633
+ * Returns paginated list of agents with full admin information.
634
+ *
635
+ * @param options - Pagination and filter options
636
+ * @returns Promise that resolves with agents list
637
+ * @throws {SDKError} If not connected or not an admin
638
+ *
639
+ * @example
640
+ * ```typescript
641
+ * const result = await sdk.listAllAgents({ limit: 50, filter: 'weather' });
642
+ * console.log(`Found ${result.total} agents matching 'weather'`);
643
+ * ```
644
+ */
645
+ public async listAllAgents(options: ListAllAgentsOptions = {}): Promise<AllAgentsResult> {
646
+ return this._admin.listAllAgents(options);
647
+ }
648
+
649
+ /**
650
+ * Gets a list of all available rooms in the Teneo Protocol.
497
651
  * Includes rooms you have access to based on your authentication.
498
652
  * Returns a read-only array to prevent external modification.
499
653
  *
@@ -784,6 +938,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
784
938
  * });
785
939
  * ```
786
940
  */
941
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
787
942
  public async listRoomAgents(roomId: string, useCache: boolean = true): Promise<any[]> {
788
943
  return this.agentRoom.listRoomAgents(roomId, useCache);
789
944
  }
@@ -805,6 +960,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
805
960
  * console.log(`${available.length} agents available to add`);
806
961
  * ```
807
962
  */
963
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
808
964
  public async listAvailableAgents(roomId: string, useCache: boolean = true): Promise<any[]> {
809
965
  return this.agentRoom.listAvailableAgents(roomId, useCache);
810
966
  }
@@ -826,6 +982,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
826
982
  * }
827
983
  * ```
828
984
  */
985
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
829
986
  public getRoomAgents(roomId: string): any[] | undefined {
830
987
  return this.agentRoom.getRoomAgents(roomId);
831
988
  }
@@ -845,6 +1002,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
845
1002
  * }
846
1003
  * ```
847
1004
  */
1005
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
848
1006
  public getAvailableAgents(roomId: string): any[] | undefined {
849
1007
  return this.agentRoom.getAvailableAgents(roomId);
850
1008
  }
@@ -911,6 +1069,79 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
911
1069
  this.agentRoom.invalidateCache(roomId);
912
1070
  }
913
1071
 
1072
+ /**
1073
+ * Updates user preferences on the server.
1074
+ * Server-side enforcement of max price per request - prevents quotes/payments exceeding the limit.
1075
+ *
1076
+ * @param preferences - User preferences to update
1077
+ * @param preferences.maxPricePerRequest - Max price per request in USDC (e.g., 0.01 = $0.01), or null to remove limit
1078
+ * @returns Promise that resolves when preferences are updated
1079
+ * @throws {SDKError} If update fails or times out
1080
+ *
1081
+ * @example
1082
+ * ```typescript
1083
+ * // Set a spending limit of $0.05 per request
1084
+ * await sdk.setUserPreferences({ maxPricePerRequest: 0.05 });
1085
+ *
1086
+ * // Remove the spending limit
1087
+ * await sdk.setUserPreferences({ maxPricePerRequest: null });
1088
+ * ```
1089
+ */
1090
+ public async setUserPreferences(preferences: {
1091
+ maxPricePerRequest?: number | null;
1092
+ }): Promise<void> {
1093
+ if (this.isDestroyed) {
1094
+ throw new SDKError("SDK has been destroyed", ErrorCode.SDK_DESTROYED, null, false);
1095
+ }
1096
+
1097
+ const message = {
1098
+ type: "set_user_preferences" as const,
1099
+ data: {
1100
+ max_price_per_request: preferences.maxPricePerRequest
1101
+ }
1102
+ };
1103
+
1104
+ return new Promise((resolve, reject) => {
1105
+ const timeout = setTimeout(() => {
1106
+ cleanup();
1107
+ reject(new SDKError("Set user preferences request timed out", ErrorCode.TIMEOUT_ERROR));
1108
+ }, 30000);
1109
+
1110
+ const handleResponse = (msg: {
1111
+ type: string;
1112
+ data?: { success?: boolean; message?: string; max_price_per_request?: number | null };
1113
+ }) => {
1114
+ if (msg.type === "user_preferences_updated") {
1115
+ cleanup();
1116
+ if (msg.data?.success) {
1117
+ this.emit("preferences:updated", {
1118
+ maxPricePerRequest: msg.data.max_price_per_request
1119
+ });
1120
+ resolve();
1121
+ } else {
1122
+ reject(
1123
+ new SDKError(
1124
+ msg.data?.message || "Failed to update preferences",
1125
+ ErrorCode.MESSAGE_ERROR
1126
+ )
1127
+ );
1128
+ }
1129
+ }
1130
+ };
1131
+
1132
+ const cleanup = () => {
1133
+ clearTimeout(timeout);
1134
+ this.wsClient.off("message:received", handleResponse);
1135
+ };
1136
+
1137
+ this.wsClient.on("message:received", handleResponse);
1138
+ this.wsClient.sendMessage(message).catch((error) => {
1139
+ cleanup();
1140
+ reject(error);
1141
+ });
1142
+ });
1143
+ }
1144
+
914
1145
  /**
915
1146
  * Configures webhook URL and headers for receiving real-time event notifications.
916
1147
  * Webhooks allow you to receive events at your server endpoint via HTTP POST requests.
@@ -1000,7 +1231,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1000
1231
  * This is a convenience getter that returns only the connection status.
1001
1232
  * For detailed state information, use getConnectionState().
1002
1233
  *
1003
- * @returns True if connected to the Teneo network, false otherwise
1234
+ * @returns True if connected to the Teneo Protocol, false otherwise
1004
1235
  *
1005
1236
  * @example
1006
1237
  * ```typescript
@@ -1021,7 +1252,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1021
1252
  * This is a convenience getter that returns only the authentication status.
1022
1253
  * For detailed auth information, use getAuthState().
1023
1254
  *
1024
- * @returns True if authenticated with the Teneo network, false otherwise
1255
+ * @returns True if authenticated with the Teneo Protocol, false otherwise
1025
1256
  *
1026
1257
  * @example
1027
1258
  * ```typescript
@@ -1306,6 +1537,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1306
1537
  this.rooms.destroy();
1307
1538
  this.agents.destroy();
1308
1539
  this.messages.destroy();
1540
+ this._admin.destroy();
1309
1541
 
1310
1542
  // Destroy other components
1311
1543
  this.webhookHandler.destroy();
@@ -1346,7 +1578,6 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1346
1578
  }
1347
1579
 
1348
1580
  // Ensure RoomManagementManager is synced with auth state
1349
- // This handles cases where auth handlers might have already set it, but ensures consistency
1350
1581
  if (state.roomObjects && state.roomObjects.length > 0) {
1351
1582
  const ownedRooms = state.roomObjects.filter((r) => r.is_owner);
1352
1583
  const sharedRooms = state.roomObjects.filter((r) => !r.is_owner);
@@ -1358,6 +1589,11 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1358
1589
  }
1359
1590
  }
1360
1591
 
1592
+ // Set up payment client for x402 payments
1593
+ if (this.secureKey && state.walletAddress) {
1594
+ this.messages.setPaymentClient(this.secureKey, state.walletAddress);
1595
+ }
1596
+
1361
1597
  this.emit("auth:success", state);
1362
1598
  });
1363
1599
  this.connection.on("auth:error", (error) => this.emit("auth:error", error));
@@ -1374,6 +1610,12 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1374
1610
  this.messages.on("agent:selected", (data) => this.emit("agent:selected", data));
1375
1611
  this.messages.on("agent:response", (response) => this.emit("agent:response", response));
1376
1612
 
1613
+ // Forward quote and payment events from MessageRouter (v2.2.0)
1614
+ this.messages.on("quote:received", (quote) => this.emit("quote:received", quote));
1615
+ this.messages.on("payment:blocked", (data) => this.emit("payment:blocked", data));
1616
+ this.messages.on("payment:attached", (data) => this.emit("payment:attached", data));
1617
+ this.messages.on("payment:error", (error) => this.emit("payment:error", error));
1618
+
1377
1619
  // Forward coordinator events from MessageRouter
1378
1620
  this.messages.on("coordinator:processing", (request) =>
1379
1621
  this.emit("coordinator:processing", request)
@@ -1494,6 +1736,24 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1494
1736
  this.emit("agent_room:list_available_error", error);
1495
1737
  });
1496
1738
 
1739
+ // Forward admin events from AdminManager
1740
+ this._admin.on("user_count", (data) => {
1741
+ this.emit("admin:user_count", data);
1742
+ });
1743
+ this._admin.on("status_changed", (isAdmin) => {
1744
+ this.emit("admin:status_changed", isAdmin);
1745
+ });
1746
+
1747
+ // Forward rate limit notifications from WebSocketClient (emitted by handlers)
1748
+ this.wsClient.on("rate_limit", (notification) => {
1749
+ this.emit("rate_limit", notification);
1750
+ });
1751
+
1752
+ // Forward user authenticated events from WebSocketClient (emitted by handlers)
1753
+ this.wsClient.on("user:authenticated", (data) => {
1754
+ this.emit("user:authenticated", data);
1755
+ });
1756
+
1497
1757
  // Forward webhook events from WebhookHandler
1498
1758
  this.webhookHandler.on("webhook:sent", (payload, url) =>
1499
1759
  this.emit("webhook:sent", payload, url)
@@ -1510,8 +1770,13 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1510
1770
  this.connection.on("error", (error) => {
1511
1771
  this.emit("error", error);
1512
1772
  // Fire and forget - don't block event emission
1773
+ // Defensive check: ensure error has toJSON method (SDKError instances do)
1774
+ const errorPayload =
1775
+ typeof error.toJSON === "function"
1776
+ ? error.toJSON()
1777
+ : { message: error.message, name: error.name, code: error.code };
1513
1778
  this.webhookHandler
1514
- .sendWebhook("error", error, { code: error.code })
1779
+ .sendWebhook("error", errorPayload, { code: error.code })
1515
1780
  .catch((webhookError) => {
1516
1781
  this.logger.error("Failed to send webhook for error event", webhookError);
1517
1782
  });
@@ -1529,6 +1794,16 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1529
1794
  return createPinoLogger(this.config.logLevel ?? "info", "TeneoSDK");
1530
1795
  }
1531
1796
 
1797
+ /**
1798
+ * Derive wallet address from private key
1799
+ */
1800
+ private deriveWalletAddress(privateKey: string | SecurePrivateKey): string {
1801
+ if (privateKey instanceof SecurePrivateKey) {
1802
+ return privateKey.use((key) => privateKeyToAccount(key as `0x${string}`).address);
1803
+ }
1804
+ return privateKeyToAccount(privateKey as `0x${string}`).address;
1805
+ }
1806
+
1532
1807
  /**
1533
1808
  * Creates a new SDK configuration builder for fluent configuration.
1534
1809
  * The builder pattern provides a more intuitive way to configure the SDK
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Agent category constants and Zod schemas
3
+ * Enables agents to be tagged with up to 2 categories for better discoverability
4
+ */
5
+
6
+ import { z } from "zod";
7
+
8
+ /**
9
+ * Predefined agent categories for classification
10
+ */
11
+ export const AGENT_CATEGORIES = [
12
+ "Trading",
13
+ "Finance",
14
+ "Crypto",
15
+ "Social Media",
16
+ "Lead Generation",
17
+ "E-Commerce",
18
+ "SEO",
19
+ "News",
20
+ "Real Estate",
21
+ "Travel",
22
+ "Automation",
23
+ "Developer Tools",
24
+ "AI",
25
+ "Integrations",
26
+ "Open Source",
27
+ "Jobs",
28
+ "Price Lists",
29
+ "Other"
30
+ ] as const;
31
+
32
+ /**
33
+ * Maximum number of categories an agent can have
34
+ */
35
+ export const MAX_CATEGORIES = 2;
36
+
37
+ /**
38
+ * Zod schema for validating a single agent category
39
+ */
40
+ export const AgentCategorySchema = z.enum(AGENT_CATEGORIES);
41
+
42
+ /**
43
+ * TypeScript type for a single agent category
44
+ */
45
+ export type AgentCategory = z.infer<typeof AgentCategorySchema>;