@teneo-protocol/sdk 2.2.1 → 3.0.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 (228) hide show
  1. package/.github/ISSUE_TEMPLATE/config.yml +1 -1
  2. package/CHANGELOG.md +366 -15
  3. package/CONCEPTS.md +182 -44
  4. package/README.md +543 -104
  5. package/dist/constants.d.ts +3 -1
  6. package/dist/constants.d.ts.map +1 -1
  7. package/dist/constants.js +5 -3
  8. package/dist/constants.js.map +1 -1
  9. package/dist/core/websocket-client.d.ts.map +1 -1
  10. package/dist/core/websocket-client.js +9 -5
  11. package/dist/core/websocket-client.js.map +1 -1
  12. package/dist/formatters/response-formatter.d.ts +6 -6
  13. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +756 -756
  14. package/dist/handlers/message-handlers/agent-details-response-handler.js +2 -2
  15. package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -1
  16. package/dist/handlers/message-handlers/agent-error-handler.d.ts +91 -0
  17. package/dist/handlers/message-handlers/agent-error-handler.d.ts.map +1 -0
  18. package/dist/handlers/message-handlers/agent-error-handler.js +44 -0
  19. package/dist/handlers/message-handlers/agent-error-handler.js.map +1 -0
  20. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +6 -0
  21. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  22. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +756 -756
  23. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -1
  24. package/dist/handlers/message-handlers/agent-status-update-handler.js +2 -7
  25. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
  26. package/dist/handlers/message-handlers/all-agents-response-handler.js +2 -2
  27. package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -1
  28. package/dist/handlers/message-handlers/auth-error-handler.d.ts +6 -0
  29. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  30. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  31. package/dist/handlers/message-handlers/auth-message-handler.js +6 -1
  32. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  33. package/dist/handlers/message-handlers/auth-required-handler.d.ts +6 -0
  34. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  35. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  36. package/dist/handlers/message-handlers/auth-success-handler.js +6 -1
  37. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  38. package/dist/handlers/message-handlers/base-handler.d.ts +2 -1
  39. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
  40. package/dist/handlers/message-handlers/base-handler.js +24 -4
  41. package/dist/handlers/message-handlers/base-handler.js.map +1 -1
  42. package/dist/handlers/message-handlers/challenge-handler.d.ts +6 -0
  43. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  44. package/dist/handlers/message-handlers/error-message-handler.d.ts +6 -0
  45. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  46. package/dist/handlers/message-handlers/index.d.ts +4 -0
  47. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  48. package/dist/handlers/message-handlers/index.js +23 -1
  49. package/dist/handlers/message-handlers/index.js.map +1 -1
  50. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +792 -756
  51. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
  52. package/dist/handlers/message-handlers/list-available-agents-handler.js +23 -10
  53. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
  54. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +756 -756
  55. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -1
  56. package/dist/handlers/message-handlers/list-room-agents-handler.js +2 -6
  57. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
  58. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  59. package/dist/handlers/message-handlers/list-rooms-response-handler.js +2 -5
  60. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
  61. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +52 -4
  62. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  63. package/dist/handlers/message-handlers/ping-pong-handler.js +23 -4
  64. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
  65. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -1
  66. package/dist/handlers/message-handlers/rate-limit-notification-handler.js +3 -2
  67. package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -1
  68. package/dist/handlers/message-handlers/regular-message-handler.d.ts +6 -0
  69. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  70. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +12 -6
  71. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  72. package/dist/handlers/message-handlers/success-handler.d.ts +82 -0
  73. package/dist/handlers/message-handlers/success-handler.d.ts.map +1 -0
  74. package/dist/handlers/message-handlers/success-handler.js +24 -0
  75. package/dist/handlers/message-handlers/success-handler.js.map +1 -0
  76. package/dist/handlers/message-handlers/task-confirmed-handler.d.ts +110 -0
  77. package/dist/handlers/message-handlers/task-confirmed-handler.d.ts.map +1 -0
  78. package/dist/handlers/message-handlers/task-confirmed-handler.js +46 -0
  79. package/dist/handlers/message-handlers/task-confirmed-handler.js.map +1 -0
  80. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts +244 -0
  81. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts.map +1 -0
  82. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js +58 -0
  83. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js.map +1 -0
  84. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +12 -6
  85. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  86. package/dist/handlers/message-handlers/user-authenticated-handler.js +2 -2
  87. package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -1
  88. package/dist/handlers/message-handlers/user-count-handler.js +2 -2
  89. package/dist/handlers/message-handlers/user-count-handler.js.map +1 -1
  90. package/dist/index.d.ts +3 -3
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +11 -4
  93. package/dist/index.js.map +1 -1
  94. package/dist/managers/admin-manager.d.ts +2 -0
  95. package/dist/managers/admin-manager.d.ts.map +1 -1
  96. package/dist/managers/admin-manager.js +3 -2
  97. package/dist/managers/admin-manager.js.map +1 -1
  98. package/dist/managers/agent-room-manager.d.ts +89 -11
  99. package/dist/managers/agent-room-manager.d.ts.map +1 -1
  100. package/dist/managers/agent-room-manager.js +99 -35
  101. package/dist/managers/agent-room-manager.js.map +1 -1
  102. package/dist/managers/index.d.ts +1 -1
  103. package/dist/managers/index.d.ts.map +1 -1
  104. package/dist/managers/index.js.map +1 -1
  105. package/dist/managers/message-router.d.ts +45 -5
  106. package/dist/managers/message-router.d.ts.map +1 -1
  107. package/dist/managers/message-router.js +96 -24
  108. package/dist/managers/message-router.js.map +1 -1
  109. package/dist/managers/room-manager.d.ts +29 -7
  110. package/dist/managers/room-manager.d.ts.map +1 -1
  111. package/dist/managers/room-manager.js +37 -11
  112. package/dist/managers/room-manager.js.map +1 -1
  113. package/dist/payments/index.d.ts +3 -1
  114. package/dist/payments/index.d.ts.map +1 -1
  115. package/dist/payments/index.js +17 -3
  116. package/dist/payments/index.js.map +1 -1
  117. package/dist/payments/networks.d.ts +59 -0
  118. package/dist/payments/networks.d.ts.map +1 -0
  119. package/dist/payments/networks.js +192 -0
  120. package/dist/payments/networks.js.map +1 -0
  121. package/dist/payments/payment-client.d.ts +55 -10
  122. package/dist/payments/payment-client.d.ts.map +1 -1
  123. package/dist/payments/payment-client.js +172 -51
  124. package/dist/payments/payment-client.js.map +1 -1
  125. package/dist/teneo-sdk.d.ts +214 -40
  126. package/dist/teneo-sdk.d.ts.map +1 -1
  127. package/dist/teneo-sdk.js +376 -85
  128. package/dist/teneo-sdk.js.map +1 -1
  129. package/dist/types/config.d.ts +335 -26
  130. package/dist/types/config.d.ts.map +1 -1
  131. package/dist/types/config.js +117 -22
  132. package/dist/types/config.js.map +1 -1
  133. package/dist/types/events.d.ts +60 -14
  134. package/dist/types/events.d.ts.map +1 -1
  135. package/dist/types/events.js.map +1 -1
  136. package/dist/types/index.d.ts +1 -1
  137. package/dist/types/index.d.ts.map +1 -1
  138. package/dist/types/index.js +11 -4
  139. package/dist/types/index.js.map +1 -1
  140. package/dist/types/messages.d.ts +9801 -7222
  141. package/dist/types/messages.d.ts.map +1 -1
  142. package/dist/types/messages.js +180 -40
  143. package/dist/types/messages.js.map +1 -1
  144. package/dist/utils/pricing-resolver.d.ts +1 -1
  145. package/dist/utils/pricing-resolver.d.ts.map +1 -1
  146. package/dist/utils/pricing-resolver.js +9 -1
  147. package/dist/utils/pricing-resolver.js.map +1 -1
  148. package/examples/agent-room-management-example.ts +5 -5
  149. package/examples/basic-usage.ts +26 -6
  150. package/examples/claude-agent-x-follower/index.ts +1 -1
  151. package/examples/minimal-chat.ts +115 -0
  152. package/examples/n8n-teneo/index.ts +2 -2
  153. package/examples/nestjs-dashboard/README.md +1 -1
  154. package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +3 -3
  155. package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +5 -5
  156. package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +8 -8
  157. package/examples/openai-teneo/index.ts +1 -1
  158. package/examples/payment-flow.ts +143 -0
  159. package/examples/production-dashboard/README.md +6 -8
  160. package/examples/production-dashboard/server.ts +22 -10
  161. package/examples/room-management-example.ts +2 -2
  162. package/examples/usage/01-connect.ts +0 -3
  163. package/examples/usage/02-list-agents.ts +0 -2
  164. package/examples/usage/03-pick-agent.ts +3 -4
  165. package/examples/usage/04-find-by-capability.ts +10 -12
  166. package/examples/usage/05-webhook-example.ts +2 -4
  167. package/examples/usage/06-simple-api-server.ts +13 -9
  168. package/examples/usage/07-event-listener.ts +1 -13
  169. package/examples/usage/README.md +33 -7
  170. package/examples/webhook-integration.ts +9 -9
  171. package/examples/x-influencer-battle-server.ts +1 -1
  172. package/package.json +3 -2
  173. package/scripts/diagnose-connection.ts +86 -0
  174. package/scripts/investigate-payload.ts +163 -0
  175. package/scripts/list-agents.ts +58 -0
  176. package/scripts/live-multi-network-test.ts +230 -0
  177. package/src/constants.ts +5 -3
  178. package/src/core/websocket-client.ts +10 -9
  179. package/src/handlers/message-handlers/agent-details-response-handler.ts +2 -2
  180. package/src/handlers/message-handlers/agent-error-handler.ts +47 -0
  181. package/src/handlers/message-handlers/agent-status-update-handler.ts +2 -7
  182. package/src/handlers/message-handlers/all-agents-response-handler.ts +2 -2
  183. package/src/handlers/message-handlers/auth-message-handler.ts +7 -1
  184. package/src/handlers/message-handlers/auth-success-handler.ts +7 -1
  185. package/src/handlers/message-handlers/base-handler.ts +24 -4
  186. package/src/handlers/message-handlers/index.ts +24 -0
  187. package/src/handlers/message-handlers/list-available-agents-handler.ts +24 -11
  188. package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -6
  189. package/src/handlers/message-handlers/list-rooms-response-handler.ts +2 -5
  190. package/src/handlers/message-handlers/ping-pong-handler.ts +29 -4
  191. package/src/handlers/message-handlers/rate-limit-notification-handler.ts +3 -2
  192. package/src/handlers/message-handlers/success-handler.ts +26 -0
  193. package/src/handlers/message-handlers/task-confirmed-handler.ts +49 -0
  194. package/src/handlers/message-handlers/trigger-wallet-tx-handler.ts +62 -0
  195. package/src/handlers/message-handlers/user-authenticated-handler.ts +2 -2
  196. package/src/handlers/message-handlers/user-count-handler.ts +2 -2
  197. package/src/index.ts +12 -4
  198. package/src/managers/admin-manager.ts +5 -2
  199. package/src/managers/agent-room-manager.ts +155 -26
  200. package/src/managers/index.ts +6 -1
  201. package/src/managers/message-router.ts +122 -27
  202. package/src/managers/room-manager.ts +39 -11
  203. package/src/payments/index.ts +20 -5
  204. package/src/payments/networks.ts +208 -0
  205. package/src/payments/payment-client.ts +211 -56
  206. package/src/teneo-sdk.ts +417 -72
  207. package/src/types/config.test.ts +24 -4
  208. package/src/types/config.ts +127 -26
  209. package/src/types/events.ts +36 -2
  210. package/src/types/index.ts +16 -3
  211. package/src/types/messages.ts +221 -57
  212. package/src/utils/pricing-resolver.ts +10 -2
  213. package/tests/direct-agent-test.ts +1 -1
  214. package/tests/integration/real-server.test.ts +1 -1
  215. package/tests/integration/websocket.test.ts +3 -3
  216. package/tests/multi-network-payment.test.ts +309 -0
  217. package/tests/multi-network.test.ts +296 -0
  218. package/tests/payment-flow-test.ts +6 -4
  219. package/tests/unit/handlers/agent-error-handler.test.ts +388 -0
  220. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +9 -6
  221. package/tests/unit/handlers/agent-status-update-handler.test.ts +11 -16
  222. package/tests/unit/handlers/list-available-agents-handler.test.ts +11 -14
  223. package/tests/unit/handlers/list-room-agents-handler.test.ts +11 -15
  224. package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -6
  225. package/tests/unit/handlers/trigger-wallet-tx-handler.test.ts +431 -0
  226. package/tests/unit/managers/admin-manager.test.ts +183 -0
  227. package/tests/unit/managers/agent-room-manager.test.ts +189 -33
  228. package/tests/unit/sdk-new-methods.test.ts +221 -0
package/src/teneo-sdk.ts CHANGED
@@ -42,11 +42,14 @@ import {
42
42
  QuoteResult,
43
43
  AdminManager,
44
44
  ListAllAgentsOptions,
45
- AllAgentsResult
45
+ AllAgentsResult,
46
+ ListAvailableAgentsOptions,
47
+ PaginatedAgentsResult
46
48
  } from "./managers";
47
49
  import { createPinoLogger } from "./utils/logger";
48
50
  import { RoomIdSchema, AgentIdSchema, AgentCommandContentSchema } from "./types/validation";
49
51
  import { SecurePrivateKey } from "./utils/secure-private-key";
52
+ import { setNetworkConfigUrl, initializeNetworks } from "./payments";
50
53
 
51
54
  // Re-export types for external use
52
55
  export type {
@@ -54,7 +57,9 @@ export type {
54
57
  AgentCommand,
55
58
  QuoteResult,
56
59
  ListAllAgentsOptions,
57
- AllAgentsResult
60
+ AllAgentsResult,
61
+ ListAvailableAgentsOptions,
62
+ PaginatedAgentsResult
58
63
  };
59
64
 
60
65
  // Zod schemas for SDK-specific interfaces
@@ -101,7 +106,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
101
106
  * @param config.wsUrl - WebSocket URL to connect to (e.g., 'wss://teneo.example.com')
102
107
  * @param config.privateKey - Optional Ethereum private key for wallet-based authentication
103
108
  * @param config.walletAddress - Optional wallet address (derived from privateKey if not provided)
104
- * @param config.autoJoinRooms - Optional array of room IDs to subscribe to automatically on connection
109
+ * @param config.autoJoinPublicRooms - Optional array of public room IDs to subscribe to automatically on connection (private rooms are auto-available)
105
110
  * @param config.webhookUrl - Optional webhook URL for receiving event notifications
106
111
  * @param config.reconnect - Enable automatic reconnection (default: true)
107
112
  * @param config.logLevel - Logging level: 'debug', 'info', 'warn', 'error', 'silent' (default: 'info')
@@ -121,7 +126,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
121
126
  * const sdk = new TeneoSDK({
122
127
  * wsUrl: 'wss://teneo.example.com',
123
128
  * privateKey: '0x...',
124
- * autoJoinRooms: ['general', 'announcements'],
129
+ * autoJoinPublicRooms: ['public-room-1', 'public-room-2'], // Public rooms only
125
130
  * webhookUrl: 'https://api.example.com/webhooks',
126
131
  * logLevel: 'debug',
127
132
  * responseFormat: 'both',
@@ -130,11 +135,12 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
130
135
  * });
131
136
  *
132
137
  * // Using builder pattern (recommended for complex configs)
133
- * const sdk = TeneoSDK.builder()
134
- * .wsUrl('wss://teneo.example.com')
135
- * .privateKey('0x...')
136
- * .withAutoJoinRooms(['general'])
138
+ * const config = TeneoSDK.builder()
139
+ * .withWebSocketUrl('wss://teneo.example.com')
140
+ * .withAuthentication('0x...')
141
+ * .withAutoJoinPublicRooms(['public-room-1', 'public-room-2'])
137
142
  * .build();
143
+ * const sdk = new TeneoSDK(config);
138
144
  * ```
139
145
  *
140
146
  * @see {@link SDKConfigBuilder} for fluent configuration API
@@ -199,20 +205,12 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
199
205
  quoteTimeout: this.config.quoteTimeout,
200
206
  wsUrl: this.config.wsUrl,
201
207
  paymentNetwork: this.config.paymentNetwork,
202
- paymentAsset: this.config.paymentAsset
208
+ paymentAsset: this.config.paymentAsset,
209
+ network: this.config.network // Network name from withNetwork()
203
210
  }
204
211
  );
205
212
 
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
- }
213
+ // NOTE: Payment client is set up in connect() after networks are initialized
216
214
 
217
215
  // Set up event forwarding
218
216
  this.setupEventForwarding();
@@ -250,12 +248,39 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
250
248
 
251
249
  try {
252
250
  this.logger.info("Connecting to Teneo Protocol");
251
+
252
+ // Initialize network configurations from backend before connecting
253
+ setNetworkConfigUrl(this.config.wsUrl);
254
+ await initializeNetworks();
255
+
256
+ // Verify networks are fully loaded before payment setup
257
+ const { NETWORKS } = await import("./payments/networks");
258
+ if (Object.keys(NETWORKS).length === 0) {
259
+ throw new SDKError(
260
+ "Failed to initialize networks from backend",
261
+ ErrorCode.CONFIG_ERROR,
262
+ null,
263
+ true
264
+ );
265
+ }
266
+
267
+ // Set up payment client now that networks are initialized (v2.2.0)
268
+ if (this.config.privateKey) {
269
+ const secureKey =
270
+ this.config.privateKey instanceof SecurePrivateKey
271
+ ? this.config.privateKey
272
+ : new SecurePrivateKey(this.config.privateKey);
273
+ const walletAddress =
274
+ this.config.walletAddress || this.deriveWalletAddress(this.config.privateKey);
275
+ this.messages.setPaymentClient(secureKey, walletAddress);
276
+ }
277
+
253
278
  await this.connection.connect();
254
279
 
255
- // Auto-join rooms if configured
256
- if (this.config.autoJoinRooms && this.config.autoJoinRooms.length > 0) {
257
- for (const room of this.config.autoJoinRooms) {
258
- await this.rooms.subscribeToRoom(room);
280
+ // Auto-join public rooms if configured
281
+ if (this.config.autoJoinPublicRooms && this.config.autoJoinPublicRooms.length > 0) {
282
+ for (const room of this.config.autoJoinPublicRooms) {
283
+ await this.rooms.subscribeToPublicRoom(room);
259
284
  }
260
285
  }
261
286
 
@@ -328,7 +353,9 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
328
353
  * @param command.agent - The agent ID or name to send the command to
329
354
  * @param command.command - The command text to send to the agent
330
355
  * @param command.room - Room to send command to (defaults to configured default room)
331
- * @returns Promise that resolves when the command is sent
356
+ * @param command.network - Optional per-request network override (e.g., "base", "avalanche", or chain ID 8453)
357
+ * @param waitForResponse - Whether to wait for the agent's response (default: false)
358
+ * @returns Promise resolving to FormattedResponse if waitForResponse is true, void otherwise
332
359
  * @throws {SDKError} If not connected to the network (ErrorCode.NOT_CONNECTED)
333
360
  * @throws {ValidationError} If agent or command are empty, or room is not configured
334
361
  *
@@ -338,8 +365,16 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
338
365
  * await sdk.sendDirectCommand({
339
366
  * agent: 'weather-agent',
340
367
  * command: 'Get forecast for New York',
341
- * room: 'general'
368
+ * room: 'room-id'
342
369
  * });
370
+ *
371
+ * // With per-request network override
372
+ * const response = await sdk.sendDirectCommand({
373
+ * agent: 'x-agent-enterprise-v2',
374
+ * command: 'user @elonmusk',
375
+ * room: 'room-id',
376
+ * network: 'base' // Pay on Base for this request
377
+ * }, true);
343
378
  * ```
344
379
  */
345
380
  public async sendDirectCommand(
@@ -354,8 +389,8 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
354
389
  * The quote includes agent selection, pricing, and expiration.
355
390
  * Does NOT auto-approve - use confirmQuote() to execute.
356
391
  */
357
- public async requestQuote(content: string, room: string): Promise<QuoteResult> {
358
- return this.messages.requestQuote(content, room);
392
+ public async requestQuote(content: string, room: string, networkOverride?: string | number): Promise<QuoteResult> {
393
+ return this.messages.requestQuote(content, room, networkOverride);
359
394
  }
360
395
 
361
396
  /**
@@ -389,14 +424,27 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
389
424
  * @example
390
425
  * ```typescript
391
426
  * // Subscribe to a public room
392
- * await sdk.subscribeToRoom('public-announcements');
427
+ * await sdk.subscribeToPublicRoom('public-room-id');
393
428
  * console.log('Subscribed to public room');
394
429
  *
395
430
  * // Note: Private rooms don't need subscription - you're always subscribed
396
431
  * ```
397
432
  */
433
+ public async subscribeToPublicRoom(roomId: string): Promise<void> {
434
+ return this.rooms.subscribeToPublicRoom(roomId);
435
+ }
436
+
437
+ /**
438
+ * @deprecated Use subscribeToPublicRoom() instead. This method only affects public rooms.
439
+ * Private rooms are automatically available after authentication without subscription.
440
+ *
441
+ * Subscribes to a public room in the Teneo Protocol.
442
+ *
443
+ * @param roomId - The ID of the public room to subscribe to
444
+ * @returns Promise that resolves when the room has been subscribed
445
+ */
398
446
  public async subscribeToRoom(roomId: string): Promise<void> {
399
- return this.rooms.subscribeToRoom(roomId);
447
+ return this.subscribeToPublicRoom(roomId);
400
448
  }
401
449
 
402
450
  /**
@@ -413,12 +461,25 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
413
461
  *
414
462
  * @example
415
463
  * ```typescript
416
- * await sdk.unsubscribeFromRoom('public-announcements');
464
+ * await sdk.unsubscribeFromPublicRoom('public-room-id');
417
465
  * console.log('Unsubscribed from public room');
418
466
  * ```
419
467
  */
468
+ public async unsubscribeFromPublicRoom(roomId: string): Promise<void> {
469
+ return this.rooms.unsubscribeFromPublicRoom(roomId);
470
+ }
471
+
472
+ /**
473
+ * @deprecated Use unsubscribeFromPublicRoom() instead. This method only affects public rooms.
474
+ * Private rooms cannot be unsubscribed from.
475
+ *
476
+ * Unsubscribes from a public room in the Teneo Protocol.
477
+ *
478
+ * @param roomId - The ID of the public room to unsubscribe from
479
+ * @returns Promise that resolves when the room has been unsubscribed
480
+ */
420
481
  public async unsubscribeFromRoom(roomId: string): Promise<void> {
421
- return this.rooms.unsubscribeFromRoom(roomId);
482
+ return this.unsubscribeFromPublicRoom(roomId);
422
483
  }
423
484
 
424
485
  /**
@@ -452,7 +513,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
452
513
  * ```typescript
453
514
  * const rooms = sdk.getSubscribedRooms();
454
515
  * console.log(`Subscribed to ${rooms.length} rooms:`, rooms);
455
- * // Example output: Subscribed to 3 rooms: ['general', 'support', 'trading']
516
+ * // Example output: Subscribed to 3 rooms: ['room-id-1', 'room-id-2', 'room-id-3']
456
517
  * ```
457
518
  */
458
519
  public getSubscribedRooms(): string[] {
@@ -502,18 +563,18 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
502
563
  }
503
564
 
504
565
  /**
505
- * Finds all agents that have a specific capability using O(1) indexed lookup (PERF-3).
566
+ * Finds all available agents (network-wide) that have a specific capability using O(1) indexed lookup (PERF-3).
506
567
  * Much faster than filtering through all agents manually.
507
568
  * Uses capability index for constant-time lookups regardless of agent count.
508
569
  *
509
570
  * @param capability - The capability name to search for (case-insensitive)
510
- * @returns Read-only array of agents with the specified capability
571
+ * @returns Read-only array of available agents with the specified capability
511
572
  * @throws {ValidationError} If capability name is invalid
512
573
  *
513
574
  * @example
514
575
  * ```typescript
515
- * // Find all weather-capable agents
516
- * const weatherAgents = sdk.findAgentsByCapability('weather-forecast');
576
+ * // Find all weather-capable agents available on the network
577
+ * const weatherAgents = sdk.findAvailableAgentsByCapability('weather-forecast');
517
578
  * console.log(`Found ${weatherAgents.length} weather agents`);
518
579
  *
519
580
  * weatherAgents.forEach(agent => {
@@ -521,54 +582,90 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
521
582
  * });
522
583
  * ```
523
584
  */
524
- public findAgentsByCapability(capability: string): ReadonlyArray<Agent> {
585
+ public findAvailableAgentsByCapability(capability: string): ReadonlyArray<Agent> {
525
586
  return this.agents.findByCapability(capability);
526
587
  }
527
588
 
528
589
  /**
529
- * Finds agents by name using O(k) token-based search (PERF-3).
590
+ * @deprecated Use findAvailableAgentsByCapability() instead. This searches all available agents network-wide.
591
+ *
592
+ * Finds all agents that have a specific capability.
593
+ *
594
+ * @param capability - The capability name to search for
595
+ * @returns Read-only array of agents with the specified capability
596
+ */
597
+ public findAgentsByCapability(capability: string): ReadonlyArray<Agent> {
598
+ return this.findAvailableAgentsByCapability(capability);
599
+ }
600
+
601
+ /**
602
+ * Finds available agents (network-wide) by name using O(k) token-based search (PERF-3).
530
603
  * Supports partial matching - searches for tokens within agent names.
531
604
  * Tokenizes both the search query and agent names for flexible matching.
532
605
  *
533
606
  * @param name - Name or partial name to search for (case-insensitive)
534
- * @returns Read-only array of agents matching the search
607
+ * @returns Read-only array of available agents matching the search
535
608
  * @throws {ValidationError} If name is invalid
536
609
  *
537
610
  * @example
538
611
  * ```typescript
539
- * // Find all agents with "weather" in their name
540
- * const agents = sdk.findAgentsByName('weather');
612
+ * // Find all available agents with "weather" in their name
613
+ * const agents = sdk.findAvailableAgentsByName('weather');
541
614
  * // Matches: "Weather Agent", "Weather Forecast Bot", "Advanced Weather API", etc.
542
615
  *
543
616
  * console.log(`Found ${agents.length} agents matching 'weather'`);
544
617
  * ```
545
618
  */
546
- public findAgentsByName(name: string): ReadonlyArray<Agent> {
619
+ public findAvailableAgentsByName(name: string): ReadonlyArray<Agent> {
547
620
  return this.agents.findByName(name);
548
621
  }
549
622
 
550
623
  /**
551
- * Finds all agents with a specific status using O(1) indexed lookup (PERF-3).
624
+ * @deprecated Use findAvailableAgentsByName() instead. This searches all available agents network-wide.
625
+ *
626
+ * Finds agents by name.
627
+ *
628
+ * @param name - Name or partial name to search for
629
+ * @returns Read-only array of agents matching the search
630
+ */
631
+ public findAgentsByName(name: string): ReadonlyArray<Agent> {
632
+ return this.findAvailableAgentsByName(name);
633
+ }
634
+
635
+ /**
636
+ * Finds all available agents (network-wide) with a specific status using O(1) indexed lookup (PERF-3).
552
637
  * Uses status index for constant-time lookups regardless of agent count.
553
638
  *
554
639
  * @param status - Agent status: 'online' or 'offline' (case-insensitive)
555
- * @returns Read-only array of agents with the specified status
640
+ * @returns Read-only array of available agents with the specified status
556
641
  * @throws {ValidationError} If status is invalid
557
642
  *
558
643
  * @example
559
644
  * ```typescript
560
- * // Get all online agents
561
- * const onlineAgents = sdk.findAgentsByStatus('online');
645
+ * // Get all online agents available on the network
646
+ * const onlineAgents = sdk.findAvailableAgentsByStatus('online');
562
647
  * console.log(`${onlineAgents.length} agents are currently online`);
563
648
  *
564
649
  * // Get offline agents
565
- * const offlineAgents = sdk.findAgentsByStatus('offline');
650
+ * const offlineAgents = sdk.findAvailableAgentsByStatus('offline');
566
651
  * ```
567
652
  */
568
- public findAgentsByStatus(status: string): ReadonlyArray<Agent> {
653
+ public findAvailableAgentsByStatus(status: string): ReadonlyArray<Agent> {
569
654
  return this.agents.findByStatus(status);
570
655
  }
571
656
 
657
+ /**
658
+ * @deprecated Use findAvailableAgentsByStatus() instead. This searches all available agents network-wide.
659
+ *
660
+ * Finds all agents with a specific status.
661
+ *
662
+ * @param status - Agent status: 'online' or 'offline'
663
+ * @returns Read-only array of agents with the specified status
664
+ */
665
+ public findAgentsByStatus(status: string): ReadonlyArray<Agent> {
666
+ return this.findAvailableAgentsByStatus(status);
667
+ }
668
+
572
669
  /**
573
670
  * Fetches detailed information about a specific agent from the server.
574
671
  * Makes a request to the server for full agent details including capabilities,
@@ -663,7 +760,15 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
663
760
  * ```
664
761
  */
665
762
  public getRooms(): ReadonlyArray<RoomInfo> {
666
- return this.rooms.getRooms();
763
+ const managerRooms = this.rooms.getRooms();
764
+ // Fall back to auth state if RoomManager hasn't been updated yet (race condition after connect)
765
+ if (managerRooms.length === 0) {
766
+ const authState = this.connection.getAuthState();
767
+ if (authState.roomObjects && authState.roomObjects.length > 0) {
768
+ return authState.roomObjects;
769
+ }
770
+ }
771
+ return managerRooms;
667
772
  }
668
773
 
669
774
  /**
@@ -675,7 +780,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
675
780
  *
676
781
  * @example
677
782
  * ```typescript
678
- * const room = sdk.getRoom('general');
783
+ * const room = sdk.getRoom('room-id');
679
784
  * if (room) {
680
785
  * console.log(`Found room: ${room.name}`);
681
786
  * console.log(`Members: ${room.members?.length ?? 0}`);
@@ -685,7 +790,13 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
685
790
  * ```
686
791
  */
687
792
  public getRoom(roomId: string): RoomInfo | undefined {
688
- return this.rooms.getRoom(roomId);
793
+ const room = this.rooms.getRoom(roomId);
794
+ // Fall back to auth state if RoomManager hasn't been updated yet (race condition after connect)
795
+ if (!room) {
796
+ const authState = this.connection.getAuthState();
797
+ return authState.roomObjects?.find((r) => r.id === roomId);
798
+ }
799
+ return room;
689
800
  }
690
801
 
691
802
  // ============================================================================
@@ -956,13 +1067,31 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
956
1067
  *
957
1068
  * @example
958
1069
  * ```typescript
1070
+ * // Simple usage (cached)
959
1071
  * const available = await sdk.listAvailableAgents('room-123');
960
1072
  * console.log(`${available.length} agents available to add`);
1073
+ *
1074
+ * // With pagination options
1075
+ * const result = await sdk.listAvailableAgents('room-123', {
1076
+ * limit: 20,
1077
+ * offset: 0,
1078
+ * sortBy: 'a-z'
1079
+ * });
1080
+ * console.log(`${result.total} total agents, showing ${result.agents.length}`);
961
1081
  * ```
962
1082
  */
963
1083
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
964
- public async listAvailableAgents(roomId: string, useCache: boolean = true): Promise<any[]> {
965
- return this.agentRoom.listAvailableAgents(roomId, useCache);
1084
+ public async listAvailableAgents(roomId: string, useCache?: boolean): Promise<any[]>;
1085
+ public async listAvailableAgents(
1086
+ roomId: string,
1087
+ options: ListAvailableAgentsOptions
1088
+ ): Promise<PaginatedAgentsResult>;
1089
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1090
+ public async listAvailableAgents(
1091
+ roomId: string,
1092
+ useCacheOrOptions?: boolean | ListAvailableAgentsOptions
1093
+ ): Promise<any[] | PaginatedAgentsResult> {
1094
+ return this.agentRoom.listAvailableAgents(roomId, useCacheOrOptions as any);
966
1095
  }
967
1096
 
968
1097
  /**
@@ -974,7 +1103,7 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
974
1103
  *
975
1104
  * @example
976
1105
  * ```typescript
977
- * const agents = sdk.getRoomAgents('room-123');
1106
+ * const agents = sdk.getCachedRoomAgents('room-123');
978
1107
  * if (agents) {
979
1108
  * console.log(`${agents.length} agents (cached)`);
980
1109
  * } else {
@@ -983,8 +1112,22 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
983
1112
  * ```
984
1113
  */
985
1114
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1115
+ public getCachedRoomAgents(roomId: string): any[] | undefined {
1116
+ return this.agentRoom.getCachedRoomAgents(roomId);
1117
+ }
1118
+
1119
+ /**
1120
+ * @deprecated Use getCachedRoomAgents() instead. This method returns cached data only.
1121
+ * Use listRoomAgents() to fetch fresh data from server.
1122
+ *
1123
+ * Gets agents in a room from cache (synchronous).
1124
+ *
1125
+ * @param roomId - ID of the room
1126
+ * @returns Array of agents if cached, undefined otherwise
1127
+ */
1128
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
986
1129
  public getRoomAgents(roomId: string): any[] | undefined {
987
- return this.agentRoom.getRoomAgents(roomId);
1130
+ return this.getCachedRoomAgents(roomId);
988
1131
  }
989
1132
 
990
1133
  /**
@@ -996,15 +1139,29 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
996
1139
  *
997
1140
  * @example
998
1141
  * ```typescript
999
- * const available = sdk.getAvailableAgents('room-123');
1142
+ * const available = sdk.getCachedAvailableAgents('room-123');
1000
1143
  * if (available) {
1001
1144
  * console.log(`${available.length} agents available (cached)`);
1002
1145
  * }
1003
1146
  * ```
1004
1147
  */
1005
1148
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1149
+ public getCachedAvailableAgents(roomId: string): any[] | undefined {
1150
+ return this.agentRoom.getCachedAvailableAgents(roomId);
1151
+ }
1152
+
1153
+ /**
1154
+ * @deprecated Use getCachedAvailableAgents() instead. This method returns cached data only.
1155
+ * Use listAvailableAgents() to fetch fresh data from server.
1156
+ *
1157
+ * Gets available agents for a room from cache (synchronous).
1158
+ *
1159
+ * @param roomId - ID of the room
1160
+ * @returns Array of available agents if cached, undefined otherwise
1161
+ */
1162
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1006
1163
  public getAvailableAgents(roomId: string): any[] | undefined {
1007
- return this.agentRoom.getAvailableAgents(roomId);
1164
+ return this.getCachedAvailableAgents(roomId);
1008
1165
  }
1009
1166
 
1010
1167
  /**
@@ -1017,18 +1174,32 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1017
1174
  *
1018
1175
  * @example
1019
1176
  * ```typescript
1020
- * const inRoom = sdk.isAgentInRoom('room-123', 'weather-agent');
1177
+ * const inRoom = sdk.checkAgentInRoom('room-123', 'weather-agent');
1021
1178
  * if (inRoom === true) {
1022
1179
  * console.log('Agent is in room');
1023
1180
  * } else if (inRoom === false) {
1024
1181
  * console.log('Agent is not in room');
1025
1182
  * } else {
1026
- * console.log('Room data not cached');
1183
+ * console.log('Room data not cached - need to fetch');
1027
1184
  * }
1028
1185
  * ```
1029
1186
  */
1187
+ public checkAgentInRoom(roomId: string, agentId: string): boolean | undefined {
1188
+ return this.agentRoom.checkAgentInRoom(roomId, agentId);
1189
+ }
1190
+
1191
+ /**
1192
+ * @deprecated Use checkAgentInRoom() instead. The 'is*' naming convention implies boolean-only,
1193
+ * but this method returns boolean | undefined to indicate cache validity.
1194
+ *
1195
+ * Checks if an agent is in a room (synchronous, from cache).
1196
+ *
1197
+ * @param roomId - ID of the room
1198
+ * @param agentId - ID of the agent
1199
+ * @returns True if agent is in room, false if not, undefined if not cached
1200
+ */
1030
1201
  public isAgentInRoom(roomId: string, agentId: string): boolean | undefined {
1031
- return this.agentRoom.isAgentInRoom(roomId, agentId);
1202
+ return this.checkAgentInRoom(roomId, agentId);
1032
1203
  }
1033
1204
 
1034
1205
  /**
@@ -1040,14 +1211,27 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1040
1211
  *
1041
1212
  * @example
1042
1213
  * ```typescript
1043
- * const count = sdk.getRoomAgentCount('room-123');
1214
+ * const count = sdk.getCachedRoomAgentCount('room-123');
1044
1215
  * if (count !== undefined) {
1045
1216
  * console.log(`Room has ${count} agents`);
1046
1217
  * }
1047
1218
  * ```
1048
1219
  */
1220
+ public getCachedRoomAgentCount(roomId: string): number | undefined {
1221
+ return this.agentRoom.getCachedRoomAgentCount(roomId);
1222
+ }
1223
+
1224
+ /**
1225
+ * @deprecated Use getCachedRoomAgentCount() instead. This method returns cached data only.
1226
+ * Use listRoomAgents() to fetch fresh data from server.
1227
+ *
1228
+ * Gets the count of agents in a room (synchronous, from cache).
1229
+ *
1230
+ * @param roomId - ID of the room
1231
+ * @returns Number of agents in room, or undefined if not cached
1232
+ */
1049
1233
  public getRoomAgentCount(roomId: string): number | undefined {
1050
- return this.agentRoom.getRoomAgentCount(roomId);
1234
+ return this.getCachedRoomAgentCount(roomId);
1051
1235
  }
1052
1236
 
1053
1237
  /**
@@ -1142,6 +1326,126 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1142
1326
  });
1143
1327
  }
1144
1328
 
1329
+ /**
1330
+ * Sends the result of an on-chain transaction back to the server.
1331
+ * Used in response to a "wallet:tx_requested" event after the user
1332
+ * has confirmed, rejected, or encountered a failure with the transaction.
1333
+ *
1334
+ * @param taskId - The task ID from the wallet:tx_requested event
1335
+ * @param status - Transaction result: "confirmed", "rejected", or "failed"
1336
+ * @param txHash - The on-chain transaction hash (required for "confirmed" status)
1337
+ * @param error - Error message (optional, for "failed" status)
1338
+ * @throws {SDKError} If the SDK has been destroyed or not connected
1339
+ *
1340
+ * @example
1341
+ * ```typescript
1342
+ * sdk.on("wallet:tx_requested", async (data) => {
1343
+ * try {
1344
+ * const txHash = await wallet.sendTransaction(data.tx);
1345
+ * await sdk.sendTxResult(data.taskId, "confirmed", txHash);
1346
+ * } catch (err) {
1347
+ * await sdk.sendTxResult(data.taskId, "failed", undefined, err.message);
1348
+ * }
1349
+ * });
1350
+ * ```
1351
+ */
1352
+ public async sendTxResult(
1353
+ taskId: string,
1354
+ status: "confirmed" | "rejected" | "failed",
1355
+ txHash?: string,
1356
+ error?: string
1357
+ ): Promise<void> {
1358
+ if (this.isDestroyed) {
1359
+ throw new SDKError("SDK has been destroyed", ErrorCode.SDK_DESTROYED, null, false);
1360
+ }
1361
+
1362
+ if (!this.wsClient.isConnected) {
1363
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
1364
+ }
1365
+
1366
+ const message = {
1367
+ type: "tx_result" as const,
1368
+ data: {
1369
+ task_id: taskId,
1370
+ status,
1371
+ ...(txHash && { tx_hash: txHash }),
1372
+ ...(error && { error })
1373
+ }
1374
+ };
1375
+
1376
+ await this.wsClient.sendMessage(message);
1377
+ }
1378
+
1379
+ /**
1380
+ * Sets the API key preference for the current user.
1381
+ * Controls whether custom API keys are used for agent interactions.
1382
+ *
1383
+ * @param useCustomKeys - Whether to use custom API keys
1384
+ * @throws {SDKError} If the SDK has been destroyed or not connected
1385
+ *
1386
+ * @example
1387
+ * ```typescript
1388
+ * // Enable custom API keys
1389
+ * await sdk.setApiKeyPreference(true);
1390
+ *
1391
+ * // Disable custom API keys
1392
+ * await sdk.setApiKeyPreference(false);
1393
+ * ```
1394
+ */
1395
+ public async setApiKeyPreference(useCustomKeys: boolean): Promise<void> {
1396
+ if (this.isDestroyed) {
1397
+ throw new SDKError("SDK has been destroyed", ErrorCode.SDK_DESTROYED, null, false);
1398
+ }
1399
+
1400
+ if (!this.wsClient.isConnected) {
1401
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
1402
+ }
1403
+
1404
+ const message = {
1405
+ type: "set_api_key_preference" as const,
1406
+ data: {
1407
+ use_custom_keys: useCustomKeys
1408
+ }
1409
+ };
1410
+
1411
+ await this.wsClient.sendMessage(message);
1412
+ }
1413
+
1414
+ /**
1415
+ * Send a room ping to get live user count
1416
+ * Server responds with room_pong message containing current live user count
1417
+ *
1418
+ * @param roomId - The room ID to ping
1419
+ * @throws {SDKError} If not connected or SDK is destroyed
1420
+ *
1421
+ * @example
1422
+ * ```typescript
1423
+ * // Ping a room to get live user count
1424
+ * await sdk.sendRoomPing("my-room");
1425
+ *
1426
+ * // Listen for the response
1427
+ * sdk.on("room:pong", (data) => {
1428
+ * console.log(`Room ${data.roomId} has ${data.liveCount} live users`);
1429
+ * });
1430
+ * ```
1431
+ */
1432
+ public async sendRoomPing(roomId: string): Promise<void> {
1433
+ if (this.isDestroyed) {
1434
+ throw new SDKError("SDK has been destroyed", ErrorCode.SDK_DESTROYED, null, false);
1435
+ }
1436
+
1437
+ if (!this.wsClient.isConnected) {
1438
+ throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
1439
+ }
1440
+
1441
+ const message = {
1442
+ type: "room_ping" as const,
1443
+ room_id: roomId
1444
+ };
1445
+
1446
+ await this.wsClient.sendMessage(message);
1447
+ }
1448
+
1145
1449
  /**
1146
1450
  * Configures webhook URL and headers for receiving real-time event notifications.
1147
1451
  * Webhooks allow you to receive events at your server endpoint via HTTP POST requests.
@@ -1541,9 +1845,9 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1541
1845
 
1542
1846
  // Destroy other components
1543
1847
  this.webhookHandler.destroy();
1544
- this.removeAllListeners();
1545
1848
 
1546
1849
  this.emit("destroy");
1850
+ this.removeAllListeners();
1547
1851
  }
1548
1852
 
1549
1853
  /**
@@ -1628,8 +1932,48 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1628
1932
  // Handle agent list updates from WebSocketClient
1629
1933
  this.wsClient.on("agent:list", (agents) => {
1630
1934
  this.agents.updateAgents(agents);
1935
+ this.emit("agent:list", agents);
1936
+ });
1937
+
1938
+ // Forward task confirmed events from WebSocketClient (emitted by handlers)
1939
+ this.wsClient.on("task:confirmed", (data) => {
1940
+ this.emit("task:confirmed", data);
1941
+ });
1942
+
1943
+ // Forward agent error events from WebSocketClient (emitted by handlers)
1944
+ this.wsClient.on("agent:error", (data) => {
1945
+ this.emit("agent:error", data);
1946
+ });
1947
+
1948
+ // Forward wallet transaction events from WebSocketClient (emitted by handlers)
1949
+ this.wsClient.on("wallet:tx_requested", (data) => {
1950
+ this.emit("wallet:tx_requested", data);
1951
+ });
1952
+
1953
+ // Forward room pong events from WebSocketClient (emitted by pong handler)
1954
+ this.wsClient.on("room:pong", (data) => {
1955
+ this.emit("room:pong", data);
1956
+ });
1957
+
1958
+ // Forward success events from WebSocketClient (emitted by handlers)
1959
+ this.wsClient.on("success", (message) => {
1960
+ this.emit("success", message);
1631
1961
  });
1632
1962
 
1963
+ // Forward message deduplication events from WebSocketClient
1964
+ this.wsClient.on("message:duplicate", (message) => this.emit("message:duplicate", message));
1965
+
1966
+ // Forward signature verification events from WebSocketClient
1967
+ this.wsClient.on("signature:verified", (messageType, address) =>
1968
+ this.emit("signature:verified", messageType, address)
1969
+ );
1970
+ this.wsClient.on("signature:failed", (messageType, reason, address) =>
1971
+ this.emit("signature:failed", messageType, reason, address)
1972
+ );
1973
+ this.wsClient.on("signature:missing", (messageType, required) =>
1974
+ this.emit("signature:missing", messageType, required)
1975
+ );
1976
+
1633
1977
  // Forward room events from WebSocketClient (emitted by room subscription handlers)
1634
1978
  this.wsClient.on("room:subscribed", (data) => this.emit("room:subscribed", data));
1635
1979
  this.wsClient.on("room:unsubscribed", (data) => this.emit("room:unsubscribed", data));
@@ -1701,11 +2045,11 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1701
2045
  // Emit on SDK for external listeners
1702
2046
  this.emit("agent_room:agents_listed", roomId, agents);
1703
2047
  });
1704
- this.wsClient.on("agent_room:available_agents_listed", (agents) => {
2048
+ this.wsClient.on("agent_room:available_agents_listed", (agents, paginationMeta) => {
1705
2049
  // Emit on AgentRoomManager for promise resolution
1706
- this.agentRoom.emit("agent_room:available_agents_listed", agents);
2050
+ this.agentRoom.emit("agent_room:available_agents_listed", agents, paginationMeta);
1707
2051
  // Emit on SDK for external listeners
1708
- this.emit("agent_room:available_agents_listed", agents);
2052
+ this.emit("agent_room:available_agents_listed", agents, paginationMeta);
1709
2053
  });
1710
2054
  this.wsClient.on("agent_room:status_update", (data) => {
1711
2055
  // Emit on SDK for external listeners
@@ -1813,13 +2157,14 @@ export class TeneoSDK extends EventEmitter<SDKEvents> {
1813
2157
  *
1814
2158
  * @example
1815
2159
  * ```typescript
1816
- * const sdk = TeneoSDK.builder()
1817
- * .wsUrl('wss://teneo.example.com')
1818
- * .privateKey('0x...')
1819
- * .withAutoJoinRooms(['general'])
1820
- * .logLevel('debug')
1821
- * .webhookUrl('https://api.example.com/webhooks')
2160
+ * const config = TeneoSDK.builder()
2161
+ * .withWebSocketUrl('wss://teneo.example.com')
2162
+ * .withAuthentication('0x...')
2163
+ * .withAutoJoinPublicRooms(['public-room-1', 'public-room-2'])
2164
+ * .withLogging('debug')
2165
+ * .withWebhook('https://api.example.com/webhooks')
1822
2166
  * .build();
2167
+ * const sdk = new TeneoSDK(config);
1823
2168
  *
1824
2169
  * await sdk.connect();
1825
2170
  * ```