@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/dist/teneo-sdk.js CHANGED
@@ -4,6 +4,39 @@
4
4
  * Provides a unified interface for external platforms to interact with Teneo agents
5
5
  * Uses manager classes to follow Single Responsibility Principle
6
6
  */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
7
40
  Object.defineProperty(exports, "__esModule", { value: true });
8
41
  exports.TeneoSDK = exports.AgentCommandSchema = exports.SendMessageOptionsSchema = void 0;
9
42
  const eventemitter3_1 = require("eventemitter3");
@@ -19,6 +52,7 @@ const managers_1 = require("./managers");
19
52
  const logger_1 = require("./utils/logger");
20
53
  const validation_1 = require("./types/validation");
21
54
  const secure_private_key_1 = require("./utils/secure-private-key");
55
+ const payments_1 = require("./payments");
22
56
  // Zod schemas for SDK-specific interfaces
23
57
  exports.SendMessageOptionsSchema = zod_1.z.object({
24
58
  room: validation_1.RoomIdSchema.optional(),
@@ -58,7 +92,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
58
92
  * @param config.wsUrl - WebSocket URL to connect to (e.g., 'wss://teneo.example.com')
59
93
  * @param config.privateKey - Optional Ethereum private key for wallet-based authentication
60
94
  * @param config.walletAddress - Optional wallet address (derived from privateKey if not provided)
61
- * @param config.autoJoinRooms - Optional array of room IDs to subscribe to automatically on connection
95
+ * @param config.autoJoinPublicRooms - Optional array of public room IDs to subscribe to automatically on connection (private rooms are auto-available)
62
96
  * @param config.webhookUrl - Optional webhook URL for receiving event notifications
63
97
  * @param config.reconnect - Enable automatic reconnection (default: true)
64
98
  * @param config.logLevel - Logging level: 'debug', 'info', 'warn', 'error', 'silent' (default: 'info')
@@ -78,7 +112,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
78
112
  * const sdk = new TeneoSDK({
79
113
  * wsUrl: 'wss://teneo.example.com',
80
114
  * privateKey: '0x...',
81
- * autoJoinRooms: ['general', 'announcements'],
115
+ * autoJoinPublicRooms: ['public-room-1', 'public-room-2'], // Public rooms only
82
116
  * webhookUrl: 'https://api.example.com/webhooks',
83
117
  * logLevel: 'debug',
84
118
  * responseFormat: 'both',
@@ -87,11 +121,12 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
87
121
  * });
88
122
  *
89
123
  * // Using builder pattern (recommended for complex configs)
90
- * const sdk = TeneoSDK.builder()
91
- * .wsUrl('wss://teneo.example.com')
92
- * .privateKey('0x...')
93
- * .withAutoJoinRooms(['general'])
124
+ * const config = TeneoSDK.builder()
125
+ * .withWebSocketUrl('wss://teneo.example.com')
126
+ * .withAuthentication('0x...')
127
+ * .withAutoJoinPublicRooms(['public-room-1', 'public-room-2'])
94
128
  * .build();
129
+ * const sdk = new TeneoSDK(config);
95
130
  * ```
96
131
  *
97
132
  * @see {@link SDKConfigBuilder} for fluent configuration API
@@ -145,16 +180,10 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
145
180
  quoteTimeout: this.config.quoteTimeout,
146
181
  wsUrl: this.config.wsUrl,
147
182
  paymentNetwork: this.config.paymentNetwork,
148
- paymentAsset: this.config.paymentAsset
183
+ paymentAsset: this.config.paymentAsset,
184
+ network: this.config.network // Network name from withNetwork()
149
185
  });
150
- // Set up payment client if private key is configured (v2.2.0)
151
- if (this.config.privateKey) {
152
- const secureKey = this.config.privateKey instanceof secure_private_key_1.SecurePrivateKey
153
- ? this.config.privateKey
154
- : new secure_private_key_1.SecurePrivateKey(this.config.privateKey);
155
- const walletAddress = this.config.walletAddress || this.deriveWalletAddress(this.config.privateKey);
156
- this.messages.setPaymentClient(secureKey, walletAddress);
157
- }
186
+ // NOTE: Payment client is set up in connect() after networks are initialized
158
187
  // Set up event forwarding
159
188
  this.setupEventForwarding();
160
189
  this.logger.info("TeneoSDK initialized", { wsUrl: this.config.wsUrl });
@@ -189,11 +218,27 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
189
218
  }
190
219
  try {
191
220
  this.logger.info("Connecting to Teneo Protocol");
221
+ // Initialize network configurations from backend before connecting
222
+ (0, payments_1.setNetworkConfigUrl)(this.config.wsUrl);
223
+ await (0, payments_1.initializeNetworks)();
224
+ // Verify networks are fully loaded before payment setup
225
+ const { NETWORKS } = await Promise.resolve().then(() => __importStar(require("./payments/networks")));
226
+ if (Object.keys(NETWORKS).length === 0) {
227
+ throw new events_1.SDKError("Failed to initialize networks from backend", error_codes_1.ErrorCode.CONFIG_ERROR, null, true);
228
+ }
229
+ // Set up payment client now that networks are initialized (v2.2.0)
230
+ if (this.config.privateKey) {
231
+ const secureKey = this.config.privateKey instanceof secure_private_key_1.SecurePrivateKey
232
+ ? this.config.privateKey
233
+ : new secure_private_key_1.SecurePrivateKey(this.config.privateKey);
234
+ const walletAddress = this.config.walletAddress || this.deriveWalletAddress(this.config.privateKey);
235
+ this.messages.setPaymentClient(secureKey, walletAddress);
236
+ }
192
237
  await this.connection.connect();
193
- // Auto-join rooms if configured
194
- if (this.config.autoJoinRooms && this.config.autoJoinRooms.length > 0) {
195
- for (const room of this.config.autoJoinRooms) {
196
- await this.rooms.subscribeToRoom(room);
238
+ // Auto-join public rooms if configured
239
+ if (this.config.autoJoinPublicRooms && this.config.autoJoinPublicRooms.length > 0) {
240
+ for (const room of this.config.autoJoinPublicRooms) {
241
+ await this.rooms.subscribeToPublicRoom(room);
197
242
  }
198
243
  }
199
244
  this.logger.info("Successfully connected to Teneo Protocol");
@@ -260,7 +305,9 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
260
305
  * @param command.agent - The agent ID or name to send the command to
261
306
  * @param command.command - The command text to send to the agent
262
307
  * @param command.room - Room to send command to (defaults to configured default room)
263
- * @returns Promise that resolves when the command is sent
308
+ * @param command.network - Optional per-request network override (e.g., "base", "avalanche", or chain ID 8453)
309
+ * @param waitForResponse - Whether to wait for the agent's response (default: false)
310
+ * @returns Promise resolving to FormattedResponse if waitForResponse is true, void otherwise
264
311
  * @throws {SDKError} If not connected to the network (ErrorCode.NOT_CONNECTED)
265
312
  * @throws {ValidationError} If agent or command are empty, or room is not configured
266
313
  *
@@ -270,8 +317,16 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
270
317
  * await sdk.sendDirectCommand({
271
318
  * agent: 'weather-agent',
272
319
  * command: 'Get forecast for New York',
273
- * room: 'general'
320
+ * room: 'room-id'
274
321
  * });
322
+ *
323
+ * // With per-request network override
324
+ * const response = await sdk.sendDirectCommand({
325
+ * agent: 'x-agent-enterprise-v2',
326
+ * command: 'user @elonmusk',
327
+ * room: 'room-id',
328
+ * network: 'base' // Pay on Base for this request
329
+ * }, true);
275
330
  * ```
276
331
  */
277
332
  async sendDirectCommand(command, waitForResponse = false) {
@@ -282,8 +337,8 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
282
337
  * The quote includes agent selection, pricing, and expiration.
283
338
  * Does NOT auto-approve - use confirmQuote() to execute.
284
339
  */
285
- async requestQuote(content, room) {
286
- return this.messages.requestQuote(content, room);
340
+ async requestQuote(content, room, networkOverride) {
341
+ return this.messages.requestQuote(content, room, networkOverride);
287
342
  }
288
343
  /**
289
344
  * Confirms a pending quote and executes the task with payment.
@@ -311,14 +366,26 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
311
366
  * @example
312
367
  * ```typescript
313
368
  * // Subscribe to a public room
314
- * await sdk.subscribeToRoom('public-announcements');
369
+ * await sdk.subscribeToPublicRoom('public-room-id');
315
370
  * console.log('Subscribed to public room');
316
371
  *
317
372
  * // Note: Private rooms don't need subscription - you're always subscribed
318
373
  * ```
319
374
  */
375
+ async subscribeToPublicRoom(roomId) {
376
+ return this.rooms.subscribeToPublicRoom(roomId);
377
+ }
378
+ /**
379
+ * @deprecated Use subscribeToPublicRoom() instead. This method only affects public rooms.
380
+ * Private rooms are automatically available after authentication without subscription.
381
+ *
382
+ * Subscribes to a public room in the Teneo Protocol.
383
+ *
384
+ * @param roomId - The ID of the public room to subscribe to
385
+ * @returns Promise that resolves when the room has been subscribed
386
+ */
320
387
  async subscribeToRoom(roomId) {
321
- return this.rooms.subscribeToRoom(roomId);
388
+ return this.subscribeToPublicRoom(roomId);
322
389
  }
323
390
  /**
324
391
  * Unsubscribes from a public room in the Teneo Protocol.
@@ -334,12 +401,24 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
334
401
  *
335
402
  * @example
336
403
  * ```typescript
337
- * await sdk.unsubscribeFromRoom('public-announcements');
404
+ * await sdk.unsubscribeFromPublicRoom('public-room-id');
338
405
  * console.log('Unsubscribed from public room');
339
406
  * ```
340
407
  */
408
+ async unsubscribeFromPublicRoom(roomId) {
409
+ return this.rooms.unsubscribeFromPublicRoom(roomId);
410
+ }
411
+ /**
412
+ * @deprecated Use unsubscribeFromPublicRoom() instead. This method only affects public rooms.
413
+ * Private rooms cannot be unsubscribed from.
414
+ *
415
+ * Unsubscribes from a public room in the Teneo Protocol.
416
+ *
417
+ * @param roomId - The ID of the public room to unsubscribe from
418
+ * @returns Promise that resolves when the room has been unsubscribed
419
+ */
341
420
  async unsubscribeFromRoom(roomId) {
342
- return this.rooms.unsubscribeFromRoom(roomId);
421
+ return this.unsubscribeFromPublicRoom(roomId);
343
422
  }
344
423
  /**
345
424
  * Lists all rooms available to the user.
@@ -371,7 +450,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
371
450
  * ```typescript
372
451
  * const rooms = sdk.getSubscribedRooms();
373
452
  * console.log(`Subscribed to ${rooms.length} rooms:`, rooms);
374
- * // Example output: Subscribed to 3 rooms: ['general', 'support', 'trading']
453
+ * // Example output: Subscribed to 3 rooms: ['room-id-1', 'room-id-2', 'room-id-3']
375
454
  * ```
376
455
  */
377
456
  getSubscribedRooms() {
@@ -418,18 +497,18 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
418
497
  return this.agents.getAgent(agentId);
419
498
  }
420
499
  /**
421
- * Finds all agents that have a specific capability using O(1) indexed lookup (PERF-3).
500
+ * Finds all available agents (network-wide) that have a specific capability using O(1) indexed lookup (PERF-3).
422
501
  * Much faster than filtering through all agents manually.
423
502
  * Uses capability index for constant-time lookups regardless of agent count.
424
503
  *
425
504
  * @param capability - The capability name to search for (case-insensitive)
426
- * @returns Read-only array of agents with the specified capability
505
+ * @returns Read-only array of available agents with the specified capability
427
506
  * @throws {ValidationError} If capability name is invalid
428
507
  *
429
508
  * @example
430
509
  * ```typescript
431
- * // Find all weather-capable agents
432
- * const weatherAgents = sdk.findAgentsByCapability('weather-forecast');
510
+ * // Find all weather-capable agents available on the network
511
+ * const weatherAgents = sdk.findAvailableAgentsByCapability('weather-forecast');
433
512
  * console.log(`Found ${weatherAgents.length} weather agents`);
434
513
  *
435
514
  * weatherAgents.forEach(agent => {
@@ -437,51 +516,84 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
437
516
  * });
438
517
  * ```
439
518
  */
440
- findAgentsByCapability(capability) {
519
+ findAvailableAgentsByCapability(capability) {
441
520
  return this.agents.findByCapability(capability);
442
521
  }
443
522
  /**
444
- * Finds agents by name using O(k) token-based search (PERF-3).
523
+ * @deprecated Use findAvailableAgentsByCapability() instead. This searches all available agents network-wide.
524
+ *
525
+ * Finds all agents that have a specific capability.
526
+ *
527
+ * @param capability - The capability name to search for
528
+ * @returns Read-only array of agents with the specified capability
529
+ */
530
+ findAgentsByCapability(capability) {
531
+ return this.findAvailableAgentsByCapability(capability);
532
+ }
533
+ /**
534
+ * Finds available agents (network-wide) by name using O(k) token-based search (PERF-3).
445
535
  * Supports partial matching - searches for tokens within agent names.
446
536
  * Tokenizes both the search query and agent names for flexible matching.
447
537
  *
448
538
  * @param name - Name or partial name to search for (case-insensitive)
449
- * @returns Read-only array of agents matching the search
539
+ * @returns Read-only array of available agents matching the search
450
540
  * @throws {ValidationError} If name is invalid
451
541
  *
452
542
  * @example
453
543
  * ```typescript
454
- * // Find all agents with "weather" in their name
455
- * const agents = sdk.findAgentsByName('weather');
544
+ * // Find all available agents with "weather" in their name
545
+ * const agents = sdk.findAvailableAgentsByName('weather');
456
546
  * // Matches: "Weather Agent", "Weather Forecast Bot", "Advanced Weather API", etc.
457
547
  *
458
548
  * console.log(`Found ${agents.length} agents matching 'weather'`);
459
549
  * ```
460
550
  */
461
- findAgentsByName(name) {
551
+ findAvailableAgentsByName(name) {
462
552
  return this.agents.findByName(name);
463
553
  }
464
554
  /**
465
- * Finds all agents with a specific status using O(1) indexed lookup (PERF-3).
555
+ * @deprecated Use findAvailableAgentsByName() instead. This searches all available agents network-wide.
556
+ *
557
+ * Finds agents by name.
558
+ *
559
+ * @param name - Name or partial name to search for
560
+ * @returns Read-only array of agents matching the search
561
+ */
562
+ findAgentsByName(name) {
563
+ return this.findAvailableAgentsByName(name);
564
+ }
565
+ /**
566
+ * Finds all available agents (network-wide) with a specific status using O(1) indexed lookup (PERF-3).
466
567
  * Uses status index for constant-time lookups regardless of agent count.
467
568
  *
468
569
  * @param status - Agent status: 'online' or 'offline' (case-insensitive)
469
- * @returns Read-only array of agents with the specified status
570
+ * @returns Read-only array of available agents with the specified status
470
571
  * @throws {ValidationError} If status is invalid
471
572
  *
472
573
  * @example
473
574
  * ```typescript
474
- * // Get all online agents
475
- * const onlineAgents = sdk.findAgentsByStatus('online');
575
+ * // Get all online agents available on the network
576
+ * const onlineAgents = sdk.findAvailableAgentsByStatus('online');
476
577
  * console.log(`${onlineAgents.length} agents are currently online`);
477
578
  *
478
579
  * // Get offline agents
479
- * const offlineAgents = sdk.findAgentsByStatus('offline');
580
+ * const offlineAgents = sdk.findAvailableAgentsByStatus('offline');
480
581
  * ```
481
582
  */
482
- findAgentsByStatus(status) {
583
+ findAvailableAgentsByStatus(status) {
483
584
  return this.agents.findByStatus(status);
484
585
  }
586
+ /**
587
+ * @deprecated Use findAvailableAgentsByStatus() instead. This searches all available agents network-wide.
588
+ *
589
+ * Finds all agents with a specific status.
590
+ *
591
+ * @param status - Agent status: 'online' or 'offline'
592
+ * @returns Read-only array of agents with the specified status
593
+ */
594
+ findAgentsByStatus(status) {
595
+ return this.findAvailableAgentsByStatus(status);
596
+ }
485
597
  /**
486
598
  * Fetches detailed information about a specific agent from the server.
487
599
  * Makes a request to the server for full agent details including capabilities,
@@ -572,7 +684,15 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
572
684
  * ```
573
685
  */
574
686
  getRooms() {
575
- return this.rooms.getRooms();
687
+ const managerRooms = this.rooms.getRooms();
688
+ // Fall back to auth state if RoomManager hasn't been updated yet (race condition after connect)
689
+ if (managerRooms.length === 0) {
690
+ const authState = this.connection.getAuthState();
691
+ if (authState.roomObjects && authState.roomObjects.length > 0) {
692
+ return authState.roomObjects;
693
+ }
694
+ }
695
+ return managerRooms;
576
696
  }
577
697
  /**
578
698
  * Gets a specific room by its unique ID.
@@ -583,7 +703,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
583
703
  *
584
704
  * @example
585
705
  * ```typescript
586
- * const room = sdk.getRoom('general');
706
+ * const room = sdk.getRoom('room-id');
587
707
  * if (room) {
588
708
  * console.log(`Found room: ${room.name}`);
589
709
  * console.log(`Members: ${room.members?.length ?? 0}`);
@@ -593,7 +713,13 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
593
713
  * ```
594
714
  */
595
715
  getRoom(roomId) {
596
- return this.rooms.getRoom(roomId);
716
+ const room = this.rooms.getRoom(roomId);
717
+ // Fall back to auth state if RoomManager hasn't been updated yet (race condition after connect)
718
+ if (!room) {
719
+ const authState = this.connection.getAuthState();
720
+ return authState.roomObjects?.find((r) => r.id === roomId);
721
+ }
722
+ return room;
597
723
  }
598
724
  // ============================================================================
599
725
  // ROOM MANAGEMENT API (v2.0.0)
@@ -829,26 +955,9 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
829
955
  async listRoomAgents(roomId, useCache = true) {
830
956
  return this.agentRoom.listRoomAgents(roomId, useCache);
831
957
  }
832
- /**
833
- * Lists all agents available to be added to a room.
834
- * Shows agents not currently in the room.
835
- * Results are cached for 5 minutes for performance.
836
- * Emits 'agent_room:available_agents_listed' when list is received.
837
- *
838
- * @param roomId - ID of the room to check available agents for
839
- * @param useCache - Whether to use cached data if available (default: true)
840
- * @returns Promise that resolves to array of available agents
841
- * @throws {SDKError} If not connected
842
- *
843
- * @example
844
- * ```typescript
845
- * const available = await sdk.listAvailableAgents('room-123');
846
- * console.log(`${available.length} agents available to add`);
847
- * ```
848
- */
849
958
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
850
- async listAvailableAgents(roomId, useCache = true) {
851
- return this.agentRoom.listAvailableAgents(roomId, useCache);
959
+ async listAvailableAgents(roomId, useCacheOrOptions) {
960
+ return this.agentRoom.listAvailableAgents(roomId, useCacheOrOptions);
852
961
  }
853
962
  /**
854
963
  * Gets agents in a room from cache (synchronous).
@@ -859,7 +968,7 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
859
968
  *
860
969
  * @example
861
970
  * ```typescript
862
- * const agents = sdk.getRoomAgents('room-123');
971
+ * const agents = sdk.getCachedRoomAgents('room-123');
863
972
  * if (agents) {
864
973
  * console.log(`${agents.length} agents (cached)`);
865
974
  * } else {
@@ -868,8 +977,21 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
868
977
  * ```
869
978
  */
870
979
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
980
+ getCachedRoomAgents(roomId) {
981
+ return this.agentRoom.getCachedRoomAgents(roomId);
982
+ }
983
+ /**
984
+ * @deprecated Use getCachedRoomAgents() instead. This method returns cached data only.
985
+ * Use listRoomAgents() to fetch fresh data from server.
986
+ *
987
+ * Gets agents in a room from cache (synchronous).
988
+ *
989
+ * @param roomId - ID of the room
990
+ * @returns Array of agents if cached, undefined otherwise
991
+ */
992
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
871
993
  getRoomAgents(roomId) {
872
- return this.agentRoom.getRoomAgents(roomId);
994
+ return this.getCachedRoomAgents(roomId);
873
995
  }
874
996
  /**
875
997
  * Gets available agents for a room from cache (synchronous).
@@ -880,15 +1002,28 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
880
1002
  *
881
1003
  * @example
882
1004
  * ```typescript
883
- * const available = sdk.getAvailableAgents('room-123');
1005
+ * const available = sdk.getCachedAvailableAgents('room-123');
884
1006
  * if (available) {
885
1007
  * console.log(`${available.length} agents available (cached)`);
886
1008
  * }
887
1009
  * ```
888
1010
  */
889
1011
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1012
+ getCachedAvailableAgents(roomId) {
1013
+ return this.agentRoom.getCachedAvailableAgents(roomId);
1014
+ }
1015
+ /**
1016
+ * @deprecated Use getCachedAvailableAgents() instead. This method returns cached data only.
1017
+ * Use listAvailableAgents() to fetch fresh data from server.
1018
+ *
1019
+ * Gets available agents for a room from cache (synchronous).
1020
+ *
1021
+ * @param roomId - ID of the room
1022
+ * @returns Array of available agents if cached, undefined otherwise
1023
+ */
1024
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
890
1025
  getAvailableAgents(roomId) {
891
- return this.agentRoom.getAvailableAgents(roomId);
1026
+ return this.getCachedAvailableAgents(roomId);
892
1027
  }
893
1028
  /**
894
1029
  * Checks if an agent is in a room (synchronous, from cache).
@@ -900,18 +1035,31 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
900
1035
  *
901
1036
  * @example
902
1037
  * ```typescript
903
- * const inRoom = sdk.isAgentInRoom('room-123', 'weather-agent');
1038
+ * const inRoom = sdk.checkAgentInRoom('room-123', 'weather-agent');
904
1039
  * if (inRoom === true) {
905
1040
  * console.log('Agent is in room');
906
1041
  * } else if (inRoom === false) {
907
1042
  * console.log('Agent is not in room');
908
1043
  * } else {
909
- * console.log('Room data not cached');
1044
+ * console.log('Room data not cached - need to fetch');
910
1045
  * }
911
1046
  * ```
912
1047
  */
1048
+ checkAgentInRoom(roomId, agentId) {
1049
+ return this.agentRoom.checkAgentInRoom(roomId, agentId);
1050
+ }
1051
+ /**
1052
+ * @deprecated Use checkAgentInRoom() instead. The 'is*' naming convention implies boolean-only,
1053
+ * but this method returns boolean | undefined to indicate cache validity.
1054
+ *
1055
+ * Checks if an agent is in a room (synchronous, from cache).
1056
+ *
1057
+ * @param roomId - ID of the room
1058
+ * @param agentId - ID of the agent
1059
+ * @returns True if agent is in room, false if not, undefined if not cached
1060
+ */
913
1061
  isAgentInRoom(roomId, agentId) {
914
- return this.agentRoom.isAgentInRoom(roomId, agentId);
1062
+ return this.checkAgentInRoom(roomId, agentId);
915
1063
  }
916
1064
  /**
917
1065
  * Gets the count of agents in a room (synchronous, from cache).
@@ -922,14 +1070,26 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
922
1070
  *
923
1071
  * @example
924
1072
  * ```typescript
925
- * const count = sdk.getRoomAgentCount('room-123');
1073
+ * const count = sdk.getCachedRoomAgentCount('room-123');
926
1074
  * if (count !== undefined) {
927
1075
  * console.log(`Room has ${count} agents`);
928
1076
  * }
929
1077
  * ```
930
1078
  */
1079
+ getCachedRoomAgentCount(roomId) {
1080
+ return this.agentRoom.getCachedRoomAgentCount(roomId);
1081
+ }
1082
+ /**
1083
+ * @deprecated Use getCachedRoomAgentCount() instead. This method returns cached data only.
1084
+ * Use listRoomAgents() to fetch fresh data from server.
1085
+ *
1086
+ * Gets the count of agents in a room (synchronous, from cache).
1087
+ *
1088
+ * @param roomId - ID of the room
1089
+ * @returns Number of agents in room, or undefined if not cached
1090
+ */
931
1091
  getRoomAgentCount(roomId) {
932
- return this.agentRoom.getRoomAgentCount(roomId);
1092
+ return this.getCachedRoomAgentCount(roomId);
933
1093
  }
934
1094
  /**
935
1095
  * Invalidates the agent-room cache for a specific room.
@@ -1007,6 +1167,109 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
1007
1167
  });
1008
1168
  });
1009
1169
  }
1170
+ /**
1171
+ * Sends the result of an on-chain transaction back to the server.
1172
+ * Used in response to a "wallet:tx_requested" event after the user
1173
+ * has confirmed, rejected, or encountered a failure with the transaction.
1174
+ *
1175
+ * @param taskId - The task ID from the wallet:tx_requested event
1176
+ * @param status - Transaction result: "confirmed", "rejected", or "failed"
1177
+ * @param txHash - The on-chain transaction hash (required for "confirmed" status)
1178
+ * @param error - Error message (optional, for "failed" status)
1179
+ * @throws {SDKError} If the SDK has been destroyed or not connected
1180
+ *
1181
+ * @example
1182
+ * ```typescript
1183
+ * sdk.on("wallet:tx_requested", async (data) => {
1184
+ * try {
1185
+ * const txHash = await wallet.sendTransaction(data.tx);
1186
+ * await sdk.sendTxResult(data.taskId, "confirmed", txHash);
1187
+ * } catch (err) {
1188
+ * await sdk.sendTxResult(data.taskId, "failed", undefined, err.message);
1189
+ * }
1190
+ * });
1191
+ * ```
1192
+ */
1193
+ async sendTxResult(taskId, status, txHash, error) {
1194
+ if (this.isDestroyed) {
1195
+ throw new events_1.SDKError("SDK has been destroyed", error_codes_1.ErrorCode.SDK_DESTROYED, null, false);
1196
+ }
1197
+ if (!this.wsClient.isConnected) {
1198
+ throw new events_1.SDKError("Not connected to Teneo Protocol", error_codes_1.ErrorCode.NOT_CONNECTED);
1199
+ }
1200
+ const message = {
1201
+ type: "tx_result",
1202
+ data: {
1203
+ task_id: taskId,
1204
+ status,
1205
+ ...(txHash && { tx_hash: txHash }),
1206
+ ...(error && { error })
1207
+ }
1208
+ };
1209
+ await this.wsClient.sendMessage(message);
1210
+ }
1211
+ /**
1212
+ * Sets the API key preference for the current user.
1213
+ * Controls whether custom API keys are used for agent interactions.
1214
+ *
1215
+ * @param useCustomKeys - Whether to use custom API keys
1216
+ * @throws {SDKError} If the SDK has been destroyed or not connected
1217
+ *
1218
+ * @example
1219
+ * ```typescript
1220
+ * // Enable custom API keys
1221
+ * await sdk.setApiKeyPreference(true);
1222
+ *
1223
+ * // Disable custom API keys
1224
+ * await sdk.setApiKeyPreference(false);
1225
+ * ```
1226
+ */
1227
+ async setApiKeyPreference(useCustomKeys) {
1228
+ if (this.isDestroyed) {
1229
+ throw new events_1.SDKError("SDK has been destroyed", error_codes_1.ErrorCode.SDK_DESTROYED, null, false);
1230
+ }
1231
+ if (!this.wsClient.isConnected) {
1232
+ throw new events_1.SDKError("Not connected to Teneo Protocol", error_codes_1.ErrorCode.NOT_CONNECTED);
1233
+ }
1234
+ const message = {
1235
+ type: "set_api_key_preference",
1236
+ data: {
1237
+ use_custom_keys: useCustomKeys
1238
+ }
1239
+ };
1240
+ await this.wsClient.sendMessage(message);
1241
+ }
1242
+ /**
1243
+ * Send a room ping to get live user count
1244
+ * Server responds with room_pong message containing current live user count
1245
+ *
1246
+ * @param roomId - The room ID to ping
1247
+ * @throws {SDKError} If not connected or SDK is destroyed
1248
+ *
1249
+ * @example
1250
+ * ```typescript
1251
+ * // Ping a room to get live user count
1252
+ * await sdk.sendRoomPing("my-room");
1253
+ *
1254
+ * // Listen for the response
1255
+ * sdk.on("room:pong", (data) => {
1256
+ * console.log(`Room ${data.roomId} has ${data.liveCount} live users`);
1257
+ * });
1258
+ * ```
1259
+ */
1260
+ async sendRoomPing(roomId) {
1261
+ if (this.isDestroyed) {
1262
+ throw new events_1.SDKError("SDK has been destroyed", error_codes_1.ErrorCode.SDK_DESTROYED, null, false);
1263
+ }
1264
+ if (!this.wsClient.isConnected) {
1265
+ throw new events_1.SDKError("Not connected to Teneo Protocol", error_codes_1.ErrorCode.NOT_CONNECTED);
1266
+ }
1267
+ const message = {
1268
+ type: "room_ping",
1269
+ room_id: roomId
1270
+ };
1271
+ await this.wsClient.sendMessage(message);
1272
+ }
1010
1273
  /**
1011
1274
  * Configures webhook URL and headers for receiving real-time event notifications.
1012
1275
  * Webhooks allow you to receive events at your server endpoint via HTTP POST requests.
@@ -1390,8 +1653,8 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
1390
1653
  this._admin.destroy();
1391
1654
  // Destroy other components
1392
1655
  this.webhookHandler.destroy();
1393
- this.removeAllListeners();
1394
1656
  this.emit("destroy");
1657
+ this.removeAllListeners();
1395
1658
  }
1396
1659
  /**
1397
1660
  * Set up event forwarding from managers
@@ -1454,7 +1717,34 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
1454
1717
  // Handle agent list updates from WebSocketClient
1455
1718
  this.wsClient.on("agent:list", (agents) => {
1456
1719
  this.agents.updateAgents(agents);
1720
+ this.emit("agent:list", agents);
1721
+ });
1722
+ // Forward task confirmed events from WebSocketClient (emitted by handlers)
1723
+ this.wsClient.on("task:confirmed", (data) => {
1724
+ this.emit("task:confirmed", data);
1725
+ });
1726
+ // Forward agent error events from WebSocketClient (emitted by handlers)
1727
+ this.wsClient.on("agent:error", (data) => {
1728
+ this.emit("agent:error", data);
1729
+ });
1730
+ // Forward wallet transaction events from WebSocketClient (emitted by handlers)
1731
+ this.wsClient.on("wallet:tx_requested", (data) => {
1732
+ this.emit("wallet:tx_requested", data);
1733
+ });
1734
+ // Forward room pong events from WebSocketClient (emitted by pong handler)
1735
+ this.wsClient.on("room:pong", (data) => {
1736
+ this.emit("room:pong", data);
1737
+ });
1738
+ // Forward success events from WebSocketClient (emitted by handlers)
1739
+ this.wsClient.on("success", (message) => {
1740
+ this.emit("success", message);
1457
1741
  });
1742
+ // Forward message deduplication events from WebSocketClient
1743
+ this.wsClient.on("message:duplicate", (message) => this.emit("message:duplicate", message));
1744
+ // Forward signature verification events from WebSocketClient
1745
+ this.wsClient.on("signature:verified", (messageType, address) => this.emit("signature:verified", messageType, address));
1746
+ this.wsClient.on("signature:failed", (messageType, reason, address) => this.emit("signature:failed", messageType, reason, address));
1747
+ this.wsClient.on("signature:missing", (messageType, required) => this.emit("signature:missing", messageType, required));
1458
1748
  // Forward room events from WebSocketClient (emitted by room subscription handlers)
1459
1749
  this.wsClient.on("room:subscribed", (data) => this.emit("room:subscribed", data));
1460
1750
  this.wsClient.on("room:unsubscribed", (data) => this.emit("room:unsubscribed", data));
@@ -1524,11 +1814,11 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
1524
1814
  // Emit on SDK for external listeners
1525
1815
  this.emit("agent_room:agents_listed", roomId, agents);
1526
1816
  });
1527
- this.wsClient.on("agent_room:available_agents_listed", (agents) => {
1817
+ this.wsClient.on("agent_room:available_agents_listed", (agents, paginationMeta) => {
1528
1818
  // Emit on AgentRoomManager for promise resolution
1529
- this.agentRoom.emit("agent_room:available_agents_listed", agents);
1819
+ this.agentRoom.emit("agent_room:available_agents_listed", agents, paginationMeta);
1530
1820
  // Emit on SDK for external listeners
1531
- this.emit("agent_room:available_agents_listed", agents);
1821
+ this.emit("agent_room:available_agents_listed", agents, paginationMeta);
1532
1822
  });
1533
1823
  this.wsClient.on("agent_room:status_update", (data) => {
1534
1824
  // Emit on SDK for external listeners
@@ -1620,13 +1910,14 @@ class TeneoSDK extends eventemitter3_1.EventEmitter {
1620
1910
  *
1621
1911
  * @example
1622
1912
  * ```typescript
1623
- * const sdk = TeneoSDK.builder()
1624
- * .wsUrl('wss://teneo.example.com')
1625
- * .privateKey('0x...')
1626
- * .withAutoJoinRooms(['general'])
1627
- * .logLevel('debug')
1628
- * .webhookUrl('https://api.example.com/webhooks')
1913
+ * const config = TeneoSDK.builder()
1914
+ * .withWebSocketUrl('wss://teneo.example.com')
1915
+ * .withAuthentication('0x...')
1916
+ * .withAutoJoinPublicRooms(['public-room-1', 'public-room-2'])
1917
+ * .withLogging('debug')
1918
+ * .withWebhook('https://api.example.com/webhooks')
1629
1919
  * .build();
1920
+ * const sdk = new TeneoSDK(config);
1630
1921
  *
1631
1922
  * await sdk.connect();
1632
1923
  * ```