@teneo-protocol/sdk 2.2.2 → 3.0.1

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 (231) 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 +524 -94
  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 +1080 -756
  14. package/dist/handlers/message-handlers/agent-details-response-handler.d.ts.map +1 -1
  15. package/dist/handlers/message-handlers/agent-details-response-handler.js +2 -2
  16. package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -1
  17. package/dist/handlers/message-handlers/agent-error-handler.d.ts +91 -0
  18. package/dist/handlers/message-handlers/agent-error-handler.d.ts.map +1 -0
  19. package/dist/handlers/message-handlers/agent-error-handler.js +44 -0
  20. package/dist/handlers/message-handlers/agent-error-handler.js.map +1 -0
  21. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +6 -0
  22. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  23. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +1080 -756
  24. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -1
  25. package/dist/handlers/message-handlers/agent-status-update-handler.js +2 -7
  26. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
  27. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +135 -54
  28. package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -1
  29. package/dist/handlers/message-handlers/all-agents-response-handler.js +2 -2
  30. package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -1
  31. package/dist/handlers/message-handlers/auth-error-handler.d.ts +6 -0
  32. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  33. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  34. package/dist/handlers/message-handlers/auth-message-handler.js +6 -1
  35. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  36. package/dist/handlers/message-handlers/auth-required-handler.d.ts +6 -0
  37. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  38. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  39. package/dist/handlers/message-handlers/auth-success-handler.js +6 -1
  40. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  41. package/dist/handlers/message-handlers/base-handler.d.ts +2 -1
  42. package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
  43. package/dist/handlers/message-handlers/base-handler.js +24 -4
  44. package/dist/handlers/message-handlers/base-handler.js.map +1 -1
  45. package/dist/handlers/message-handlers/challenge-handler.d.ts +6 -0
  46. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  47. package/dist/handlers/message-handlers/error-message-handler.d.ts +6 -0
  48. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  49. package/dist/handlers/message-handlers/index.d.ts +4 -0
  50. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  51. package/dist/handlers/message-handlers/index.js +23 -1
  52. package/dist/handlers/message-handlers/index.js.map +1 -1
  53. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +1116 -756
  54. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
  55. package/dist/handlers/message-handlers/list-available-agents-handler.js +23 -10
  56. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
  57. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +1080 -756
  58. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -1
  59. package/dist/handlers/message-handlers/list-room-agents-handler.js +2 -6
  60. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
  61. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  62. package/dist/handlers/message-handlers/list-rooms-response-handler.js +2 -5
  63. package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
  64. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +52 -4
  65. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  66. package/dist/handlers/message-handlers/ping-pong-handler.js +23 -4
  67. package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
  68. package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -1
  69. package/dist/handlers/message-handlers/rate-limit-notification-handler.js +3 -2
  70. package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -1
  71. package/dist/handlers/message-handlers/regular-message-handler.d.ts +6 -0
  72. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  73. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +12 -6
  74. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  75. package/dist/handlers/message-handlers/success-handler.d.ts +82 -0
  76. package/dist/handlers/message-handlers/success-handler.d.ts.map +1 -0
  77. package/dist/handlers/message-handlers/success-handler.js +24 -0
  78. package/dist/handlers/message-handlers/success-handler.js.map +1 -0
  79. package/dist/handlers/message-handlers/task-confirmed-handler.d.ts +110 -0
  80. package/dist/handlers/message-handlers/task-confirmed-handler.d.ts.map +1 -0
  81. package/dist/handlers/message-handlers/task-confirmed-handler.js +46 -0
  82. package/dist/handlers/message-handlers/task-confirmed-handler.js.map +1 -0
  83. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts +244 -0
  84. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts.map +1 -0
  85. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js +58 -0
  86. package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js.map +1 -0
  87. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +12 -6
  88. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  89. package/dist/handlers/message-handlers/user-authenticated-handler.js +2 -2
  90. package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -1
  91. package/dist/handlers/message-handlers/user-count-handler.js +2 -2
  92. package/dist/handlers/message-handlers/user-count-handler.js.map +1 -1
  93. package/dist/index.d.ts +3 -3
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +11 -4
  96. package/dist/index.js.map +1 -1
  97. package/dist/managers/admin-manager.d.ts +3 -1
  98. package/dist/managers/admin-manager.d.ts.map +1 -1
  99. package/dist/managers/admin-manager.js +4 -3
  100. package/dist/managers/admin-manager.js.map +1 -1
  101. package/dist/managers/agent-room-manager.d.ts +89 -11
  102. package/dist/managers/agent-room-manager.d.ts.map +1 -1
  103. package/dist/managers/agent-room-manager.js +99 -35
  104. package/dist/managers/agent-room-manager.js.map +1 -1
  105. package/dist/managers/index.d.ts +1 -1
  106. package/dist/managers/index.d.ts.map +1 -1
  107. package/dist/managers/index.js.map +1 -1
  108. package/dist/managers/message-router.d.ts +45 -5
  109. package/dist/managers/message-router.d.ts.map +1 -1
  110. package/dist/managers/message-router.js +96 -24
  111. package/dist/managers/message-router.js.map +1 -1
  112. package/dist/managers/room-manager.d.ts +29 -7
  113. package/dist/managers/room-manager.d.ts.map +1 -1
  114. package/dist/managers/room-manager.js +37 -11
  115. package/dist/managers/room-manager.js.map +1 -1
  116. package/dist/payments/index.d.ts +3 -1
  117. package/dist/payments/index.d.ts.map +1 -1
  118. package/dist/payments/index.js +17 -3
  119. package/dist/payments/index.js.map +1 -1
  120. package/dist/payments/networks.d.ts +59 -0
  121. package/dist/payments/networks.d.ts.map +1 -0
  122. package/dist/payments/networks.js +192 -0
  123. package/dist/payments/networks.js.map +1 -0
  124. package/dist/payments/payment-client.d.ts +55 -10
  125. package/dist/payments/payment-client.d.ts.map +1 -1
  126. package/dist/payments/payment-client.js +172 -51
  127. package/dist/payments/payment-client.js.map +1 -1
  128. package/dist/teneo-sdk.d.ts +215 -41
  129. package/dist/teneo-sdk.d.ts.map +1 -1
  130. package/dist/teneo-sdk.js +361 -84
  131. package/dist/teneo-sdk.js.map +1 -1
  132. package/dist/types/config.d.ts +334 -25
  133. package/dist/types/config.d.ts.map +1 -1
  134. package/dist/types/config.js +114 -22
  135. package/dist/types/config.js.map +1 -1
  136. package/dist/types/events.d.ts +60 -14
  137. package/dist/types/events.d.ts.map +1 -1
  138. package/dist/types/events.js.map +1 -1
  139. package/dist/types/index.d.ts +1 -1
  140. package/dist/types/index.d.ts.map +1 -1
  141. package/dist/types/index.js +11 -4
  142. package/dist/types/index.js.map +1 -1
  143. package/dist/types/messages.d.ts +13110 -7451
  144. package/dist/types/messages.d.ts.map +1 -1
  145. package/dist/types/messages.js +195 -44
  146. package/dist/types/messages.js.map +1 -1
  147. package/dist/utils/pricing-resolver.d.ts +1 -1
  148. package/dist/utils/pricing-resolver.d.ts.map +1 -1
  149. package/dist/utils/pricing-resolver.js +9 -1
  150. package/dist/utils/pricing-resolver.js.map +1 -1
  151. package/examples/agent-room-management-example.ts +5 -5
  152. package/examples/basic-usage.ts +26 -6
  153. package/examples/claude-agent-x-follower/index.ts +1 -1
  154. package/examples/minimal-chat.ts +4 -3
  155. package/examples/n8n-teneo/index.ts +2 -2
  156. package/examples/nestjs-dashboard/README.md +1 -1
  157. package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +3 -3
  158. package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +5 -5
  159. package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +8 -8
  160. package/examples/openai-teneo/index.ts +1 -1
  161. package/examples/payment-flow.ts +143 -0
  162. package/examples/production-dashboard/README.md +6 -8
  163. package/examples/production-dashboard/server.ts +22 -10
  164. package/examples/room-management-example.ts +2 -2
  165. package/examples/usage/01-connect.ts +0 -3
  166. package/examples/usage/02-list-agents.ts +0 -2
  167. package/examples/usage/03-pick-agent.ts +3 -4
  168. package/examples/usage/04-find-by-capability.ts +10 -12
  169. package/examples/usage/05-webhook-example.ts +2 -4
  170. package/examples/usage/06-simple-api-server.ts +13 -9
  171. package/examples/usage/07-event-listener.ts +1 -13
  172. package/examples/usage/README.md +33 -7
  173. package/examples/webhook-integration.ts +9 -9
  174. package/examples/x-influencer-battle-server.ts +1 -1
  175. package/package.json +1 -1
  176. package/scripts/diagnose-connection.ts +86 -0
  177. package/scripts/investigate-payload.ts +163 -0
  178. package/scripts/list-agents.ts +58 -0
  179. package/scripts/live-multi-network-test.ts +230 -0
  180. package/src/constants.ts +5 -3
  181. package/src/core/websocket-client.ts +10 -9
  182. package/src/handlers/message-handlers/agent-details-response-handler.ts +2 -2
  183. package/src/handlers/message-handlers/agent-error-handler.ts +47 -0
  184. package/src/handlers/message-handlers/agent-status-update-handler.ts +2 -7
  185. package/src/handlers/message-handlers/all-agents-response-handler.ts +2 -2
  186. package/src/handlers/message-handlers/auth-message-handler.ts +7 -1
  187. package/src/handlers/message-handlers/auth-success-handler.ts +7 -1
  188. package/src/handlers/message-handlers/base-handler.ts +24 -4
  189. package/src/handlers/message-handlers/index.ts +24 -0
  190. package/src/handlers/message-handlers/list-available-agents-handler.ts +24 -11
  191. package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -6
  192. package/src/handlers/message-handlers/list-rooms-response-handler.ts +2 -5
  193. package/src/handlers/message-handlers/ping-pong-handler.ts +29 -4
  194. package/src/handlers/message-handlers/rate-limit-notification-handler.ts +3 -2
  195. package/src/handlers/message-handlers/success-handler.ts +26 -0
  196. package/src/handlers/message-handlers/task-confirmed-handler.ts +49 -0
  197. package/src/handlers/message-handlers/trigger-wallet-tx-handler.ts +62 -0
  198. package/src/handlers/message-handlers/user-authenticated-handler.ts +2 -2
  199. package/src/handlers/message-handlers/user-count-handler.ts +2 -2
  200. package/src/index.ts +12 -4
  201. package/src/managers/admin-manager.ts +6 -3
  202. package/src/managers/agent-room-manager.ts +155 -26
  203. package/src/managers/index.ts +6 -1
  204. package/src/managers/message-router.ts +122 -27
  205. package/src/managers/room-manager.ts +39 -11
  206. package/src/payments/index.ts +20 -5
  207. package/src/payments/networks.ts +208 -0
  208. package/src/payments/payment-client.ts +211 -56
  209. package/src/teneo-sdk.ts +402 -71
  210. package/src/types/config.test.ts +24 -4
  211. package/src/types/config.ts +123 -25
  212. package/src/types/events.ts +36 -2
  213. package/src/types/index.ts +16 -3
  214. package/src/types/messages.ts +235 -60
  215. package/src/utils/pricing-resolver.ts +10 -2
  216. package/tests/direct-agent-test.ts +1 -1
  217. package/tests/integration/real-server.test.ts +1 -1
  218. package/tests/integration/websocket.test.ts +3 -3
  219. package/tests/multi-network-payment.test.ts +309 -0
  220. package/tests/multi-network.test.ts +296 -0
  221. package/tests/payment-flow-test.ts +6 -4
  222. package/tests/unit/handlers/agent-error-handler.test.ts +388 -0
  223. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +9 -6
  224. package/tests/unit/handlers/agent-status-update-handler.test.ts +11 -16
  225. package/tests/unit/handlers/list-available-agents-handler.test.ts +11 -14
  226. package/tests/unit/handlers/list-room-agents-handler.test.ts +11 -15
  227. package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -6
  228. package/tests/unit/handlers/trigger-wallet-tx-handler.test.ts +431 -0
  229. package/tests/unit/managers/admin-manager.test.ts +183 -0
  230. package/tests/unit/managers/agent-room-manager.test.ts +189 -33
  231. package/tests/unit/sdk-new-methods.test.ts +221 -0
@@ -32,7 +32,7 @@ PRIVATE_KEY=your_ethereum_private_key_here
32
32
  WS_URL=wss://your-teneo-server.com/ws
33
33
 
34
34
  # Optional
35
- DEFAULT_ROOM=general
35
+ DEFAULT_ROOM=your-room-id
36
36
  WALLET_ADDRESS=0x... # Auto-derived if not provided
37
37
  LOG_LEVEL=info
38
38
  ```
@@ -279,6 +279,20 @@ We recommend following this learning path:
279
279
 
280
280
  ## 🔧 Common Patterns
281
281
 
282
+ ### Understanding Message Routing
283
+
284
+ The SDK supports two routing approaches depending on your environment:
285
+
286
+ **Coordinator Environments:**
287
+ - Natural language messages work: `"Get bitcoin info"`
288
+ - Coordinator automatically selects the best agent
289
+ - Direct commands also work for explicit agent selection
290
+
291
+ **Non-Coordinator Environments:**
292
+ - Must use direct command syntax: `"@Agent Name command params"`
293
+ - Example: `"@X Platform Agent search bitcoin 5"`
294
+ - Required for all messages in these environments
295
+
282
296
  ### Pattern 1: Basic Message Flow
283
297
 
284
298
  ```typescript
@@ -287,7 +301,7 @@ await sdk.connect();
287
301
 
288
302
  // Send and wait for response
289
303
  const response = await sdk.sendMessage('hello', {
290
- room: 'general',
304
+ room: roomId,
291
305
  waitForResponse: true,
292
306
  timeout: 30000
293
307
  });
@@ -297,19 +311,31 @@ console.log(response.humanized);
297
311
 
298
312
  ### Pattern 2: Direct Agent Command
299
313
 
314
+ Direct commands work in all environments and are **required** in non-coordinator environments.
315
+
300
316
  ```typescript
301
317
  // Find agent by capability
302
- const agents = sdk.findAgentsByCapability('weather');
318
+ const agents = sdk.findAvailableAgentsByCapability('weather');
303
319
  const weatherAgent = agents[0];
304
320
 
305
- // Send direct command
321
+ // Option 1: Use @mention syntax (recommended)
322
+ const response = await sdk.sendMessage('@Weather Agent forecast for NYC', {
323
+ room: roomId,
324
+ waitForResponse: true
325
+ });
326
+
327
+ // Option 2: Use sendDirectCommand
306
328
  const response = await sdk.sendDirectCommand({
307
- agent: weatherAgent.id,
329
+ agent: weatherAgent.name, // Use full agent name
308
330
  command: 'forecast for NYC',
309
- room: 'general'
331
+ room: roomId
310
332
  }, true);
311
333
  ```
312
334
 
335
+ **When to use:**
336
+ - **Required** in non-coordinator environments
337
+ - **Optional** in coordinator environments (explicit agent selection)
338
+
313
339
  ### Pattern 3: Event-Driven
314
340
 
315
341
  ```typescript
@@ -319,7 +345,7 @@ sdk.on('agent:response', (response) => {
319
345
  });
320
346
 
321
347
  // Fire and forget
322
- await sdk.sendMessage('hello', { room: 'general' });
348
+ await sdk.sendMessage('hello', { room: roomId });
323
349
  ```
324
350
 
325
351
  ## 🐛 Troubleshooting
@@ -66,7 +66,7 @@ async function main() {
66
66
  const sdk = new TeneoSDK({
67
67
  wsUrl: process.env.WS_URL || "ws://localhost:8080/ws",
68
68
  privateKey: process.env.PRIVATE_KEY,
69
- autoJoinRooms: ["general"],
69
+ autoJoinPublicRooms: [process.env.ROOM_ID || "your-room-id"],
70
70
 
71
71
  // Webhook configuration
72
72
  webhookUrl: "http://localhost:3000/webhook",
@@ -106,20 +106,20 @@ async function main() {
106
106
  console.log("[SDK] Connecting to Teneo Protocol...");
107
107
  await sdk.connect();
108
108
 
109
- // Wait for ready
110
- await new Promise<void>((resolve) => {
111
- sdk.once("ready", resolve);
112
- });
113
-
114
109
  console.log("[SDK] Connected and ready!");
115
110
 
116
111
  // Send some test messages
117
112
  console.log("\n[SDK] Sending test messages...\n");
118
113
 
119
114
  // These will trigger webhooks
120
- await sdk.sendMessage("What is blockchain technology?", { room: "general" });
121
- await sdk.sendMessage("Explain quantum computing in simple terms", { room: "general" });
122
- await sdk.sendMessage("How does machine learning work?", { room: "general" });
115
+ // WITH COORDINATOR: Natural language
116
+ await sdk.sendMessage("What is blockchain technology?", { room: process.env.ROOM_ID || "your-room-id" });
117
+ await sdk.sendMessage("Explain quantum computing in simple terms", { room: process.env.ROOM_ID || "your-room-id" });
118
+
119
+ // WITHOUT COORDINATOR: Direct command (use @Agent Name syntax)
120
+ // await sdk.sendMessage("@X Platform Agent search bitcoin 5", { room: process.env.ROOM_ID || "your-room-id" });
121
+
122
+ await sdk.sendMessage("How does machine learning work?", { room: process.env.ROOM_ID || "your-room-id" });
123
123
 
124
124
  // Check webhook queue status
125
125
  const webhookStatus = sdk.getWebhookStatus();
@@ -55,7 +55,7 @@ async function initSDK() {
55
55
  const config = new SDKConfigBuilder()
56
56
  .withWebSocketUrl(WS_URL)
57
57
  .withAuthentication(PRIVATE_KEY, WALLET_ADDRESS)
58
- .withAutoJoinRooms([ROOM]) // Auto-join rooms on connect
58
+ .withAutoJoinPublicRooms([ROOM]) // Auto-join rooms on connect
59
59
  .withReconnection(true, 5000, 10) // Enable reconnection
60
60
  .withResponseFormat("both", true) // Get both raw and humanized responses with metadata
61
61
  .withLogging("debug") // Enable debug logging
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teneo-protocol/sdk",
3
- "version": "2.2.2",
3
+ "version": "3.0.1",
4
4
  "description": "TypeScript SDK for external platforms to interact with Teneo agents",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Diagnose connection and message flow
3
+ * Run with: npx tsx scripts/diagnose-connection.ts
4
+ */
5
+
6
+ import { TeneoSDK, SDKConfigBuilder } from "../src";
7
+ import { SecurePrivateKey } from "../src/utils/secure-private-key";
8
+
9
+ const WS_URL = process.env.TENEO_WS_URL || "wss://backend.developer.chatroom.teneo-protocol.ai/ws";
10
+ const TEST_PRIVATE_KEY = process.env.TENEO_PRIVATE_KEY || "0xYOUR_PRIVATE_KEY_HERE";
11
+
12
+ async function diagnose() {
13
+ console.log("=".repeat(60));
14
+ console.log("CONNECTION DIAGNOSTIC");
15
+ console.log("=".repeat(60));
16
+
17
+ const secureKey = new SecurePrivateKey(TEST_PRIVATE_KEY);
18
+
19
+ const config = new SDKConfigBuilder()
20
+ .withWebSocketUrl(WS_URL)
21
+ .withAuthentication(secureKey)
22
+ .withLogging("debug")
23
+ .withPayments({ autoApprove: false })
24
+ .build();
25
+
26
+ const sdk = new TeneoSDK(config);
27
+
28
+ // Listen to all events
29
+ const events = [
30
+ "connected", "disconnected", "authenticated", "error",
31
+ "message:received", "message:sent", "message:error",
32
+ "agent:response", "agent:selected", "agents:list"
33
+ ];
34
+
35
+ for (const event of events) {
36
+ sdk.on(event as any, (data: any) => {
37
+ console.log(`\n[EVENT: ${event}]`);
38
+ if (typeof data === "object") {
39
+ console.log(JSON.stringify(data, null, 2).substring(0, 500));
40
+ } else {
41
+ console.log(data);
42
+ }
43
+ });
44
+ }
45
+
46
+ try {
47
+ console.log("\nConnecting...");
48
+ await sdk.connect();
49
+ console.log("\nConnected!");
50
+
51
+ // Get auth state
52
+ const authState = sdk.getAuthState();
53
+ console.log("\nAuth State:", JSON.stringify(authState, null, 2));
54
+
55
+ // Get connection state
56
+ const connState = sdk.getConnectionState();
57
+ console.log("\nConnection State:", JSON.stringify(connState, null, 2));
58
+
59
+ // Wait for agents list
60
+ console.log("\nWaiting for agents list (10s)...");
61
+ await new Promise(resolve => setTimeout(resolve, 10000));
62
+
63
+ // Try to send a simple message (fire and forget)
64
+ console.log("\nSending test message (fire and forget)...");
65
+ try {
66
+ await sdk.sendMessage("hello", { room: "public" });
67
+ console.log("Message sent successfully");
68
+ } catch (err) {
69
+ console.log("Send error:", err);
70
+ }
71
+
72
+ // Wait for any response
73
+ console.log("\nWaiting for response (15s)...");
74
+ await new Promise(resolve => setTimeout(resolve, 15000));
75
+
76
+ await sdk.disconnect();
77
+ console.log("\nDisconnected");
78
+
79
+ } catch (error) {
80
+ console.error("Error:", error);
81
+ }
82
+
83
+ process.exit(0);
84
+ }
85
+
86
+ diagnose().catch(console.error);
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Investigate WebSocket payload sizes from the Teneo server
3
+ * Run with: npx tsx scripts/investigate-payload.ts
4
+ */
5
+
6
+ import WebSocket from "ws";
7
+ import { privateKeyToAccount } from "viem/accounts";
8
+
9
+ const WS_URL = process.env.TENEO_WS_URL || "wss://backend.developer.chatroom.teneo-protocol.ai/ws";
10
+
11
+ // Set via environment variable
12
+ const TEST_PRIVATE_KEY = process.env.TENEO_PRIVATE_KEY || "0xYOUR_PRIVATE_KEY_HERE";
13
+
14
+ console.log("Connecting to:", WS_URL);
15
+ console.log("Max payload set to 10MB\n");
16
+
17
+ const account = privateKeyToAccount(TEST_PRIVATE_KEY);
18
+ console.log("Wallet address:", account.address, "\n");
19
+
20
+ const ws = new WebSocket(WS_URL, {
21
+ maxPayload: 10 * 1024 * 1024 // 10MB max
22
+ });
23
+
24
+ let messageCount = 0;
25
+ let totalBytes = 0;
26
+ const messageSizes: { type: string; size: number; preview: string }[] = [];
27
+ let authStarted = false;
28
+
29
+ ws.on("open", () => {
30
+ console.log("✅ Connected\n");
31
+ });
32
+
33
+ ws.on("message", async (data: Buffer) => {
34
+ messageCount++;
35
+ const size = data.length;
36
+ totalBytes += size;
37
+
38
+ let parsed: any;
39
+ let type = "unknown";
40
+ let preview = "";
41
+
42
+ try {
43
+ parsed = JSON.parse(data.toString());
44
+ type = parsed.type || parsed.action || "json";
45
+
46
+ if (parsed.type === "room_history") {
47
+ const historyLength = parsed.data?.history?.length || 0;
48
+ preview = `${historyLength} messages in history`;
49
+ } else if (parsed.type === "auth_success") {
50
+ preview = `wallet: ${parsed.data?.address?.substring(0, 10)}...`;
51
+ } else if (parsed.type === "challenge") {
52
+ preview = `challenge: ${parsed.data?.challenge?.substring(0, 20)}...`;
53
+ } else {
54
+ preview = JSON.stringify(parsed).substring(0, 100);
55
+ }
56
+ } catch {
57
+ preview = data.toString().substring(0, 100);
58
+ }
59
+
60
+ const sizeStr = formatBytes(size);
61
+ messageSizes.push({ type, size, preview });
62
+
63
+ console.log(`Message #${messageCount}: ${type}`);
64
+ console.log(` Size: ${sizeStr}`);
65
+ console.log(` Preview: ${preview}`);
66
+ console.log("");
67
+
68
+ // Handle auth flow using correct SDK message format
69
+ if (parsed?.type === "auth_required" && !authStarted) {
70
+ authStarted = true;
71
+ console.log("📤 Requesting challenge...\n");
72
+ ws.send(JSON.stringify({
73
+ type: "request_challenge",
74
+ data: {
75
+ userType: "user",
76
+ address: account.address
77
+ }
78
+ }));
79
+ } else if (parsed?.type === "challenge") {
80
+ const challenge = parsed.data?.challenge;
81
+ console.log("📤 Signing challenge and authenticating...\n");
82
+ const messageToSign = `Teneo authentication challenge: ${challenge}`;
83
+ const signature = await account.signMessage({ message: messageToSign });
84
+ ws.send(JSON.stringify({
85
+ type: "auth",
86
+ data: {
87
+ address: account.address,
88
+ signature,
89
+ message: messageToSign,
90
+ userType: "user"
91
+ }
92
+ }));
93
+ }
94
+
95
+ // After receiving enough messages post-auth, close and summarize
96
+ if (messageCount >= 15 || totalBytes > 100 * 1024 * 1024) {
97
+ summarize();
98
+ ws.close();
99
+ }
100
+ });
101
+
102
+ ws.on("error", (err) => {
103
+ console.error("❌ Error:", err.message);
104
+ });
105
+
106
+ ws.on("close", (code, reason) => {
107
+ console.log(`\nConnection closed: ${code} ${reason}`);
108
+ if (messageCount > 1) summarize();
109
+ process.exit(0);
110
+ });
111
+
112
+ function formatBytes(bytes: number): string {
113
+ if (bytes < 1024) return `${bytes} B`;
114
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;
115
+ return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
116
+ }
117
+
118
+ function summarize() {
119
+ console.log("\n" + "=".repeat(60));
120
+ console.log("PAYLOAD SIZE INVESTIGATION SUMMARY");
121
+ console.log("=".repeat(60));
122
+ console.log(`Total messages received: ${messageCount}`);
123
+ console.log(`Total bytes received: ${formatBytes(totalBytes)}`);
124
+ console.log("\nBy message type:");
125
+
126
+ const byType: Record<string, { count: number; totalSize: number }> = {};
127
+ for (const msg of messageSizes) {
128
+ if (!byType[msg.type]) {
129
+ byType[msg.type] = { count: 0, totalSize: 0 };
130
+ }
131
+ byType[msg.type].count++;
132
+ byType[msg.type].totalSize += msg.size;
133
+ }
134
+
135
+ for (const [type, stats] of Object.entries(byType)) {
136
+ console.log(` ${type}: ${stats.count} messages, ${formatBytes(stats.totalSize)}`);
137
+ }
138
+
139
+ console.log("\nLargest messages:");
140
+ const sorted = [...messageSizes].sort((a, b) => b.size - a.size).slice(0, 5);
141
+ for (const msg of sorted) {
142
+ console.log(` ${msg.type}: ${formatBytes(msg.size)} - ${msg.preview.substring(0, 50)}`);
143
+ }
144
+
145
+ // Check if any message exceeded 2MB (original limit)
146
+ const over2mb = messageSizes.filter(m => m.size > 2 * 1024 * 1024);
147
+ if (over2mb.length > 0) {
148
+ console.log("\n⚠️ Messages exceeding original 2MB limit:");
149
+ for (const msg of over2mb) {
150
+ console.log(` ${msg.type}: ${formatBytes(msg.size)}`);
151
+ }
152
+ } else {
153
+ console.log("\n✅ No messages exceeded the original 2MB limit");
154
+ }
155
+ }
156
+
157
+ // Timeout after 30 seconds
158
+ setTimeout(() => {
159
+ console.log("\n⏰ Timeout - closing connection");
160
+ summarize();
161
+ ws.close();
162
+ process.exit(0);
163
+ }, 30000);
@@ -0,0 +1,58 @@
1
+ /**
2
+ * List available agents
3
+ * Run with: npx tsx scripts/list-agents.ts
4
+ */
5
+
6
+ import { TeneoSDK, SDKConfigBuilder } from "../src";
7
+ import { SecurePrivateKey } from "../src/utils/secure-private-key";
8
+
9
+ const WS_URL = process.env.TENEO_WS_URL || "wss://backend.developer.chatroom.teneo-protocol.ai/ws";
10
+ const TEST_PRIVATE_KEY = process.env.TENEO_PRIVATE_KEY || "0xYOUR_PRIVATE_KEY_HERE";
11
+
12
+ async function listAgents() {
13
+ console.log("Listing available agents...\n");
14
+
15
+ const secureKey = new SecurePrivateKey(TEST_PRIVATE_KEY);
16
+
17
+ const config = new SDKConfigBuilder()
18
+ .withWebSocketUrl(WS_URL)
19
+ .withAuthentication(secureKey)
20
+ .withLogging("warn")
21
+ .build();
22
+
23
+ const sdk = new TeneoSDK(config);
24
+
25
+ try {
26
+ await sdk.connect();
27
+ console.log("Connected!\n");
28
+
29
+ // Wait for agents list
30
+ await new Promise(resolve => setTimeout(resolve, 3000));
31
+
32
+ // Get auth state for rooms
33
+ const authState = sdk.getAuthState();
34
+ console.log("User's rooms:", authState.rooms);
35
+ console.log("Private room:", authState.privateRoomIds?.[0] || "none");
36
+ console.log();
37
+
38
+ // Get available agents
39
+ const agents = sdk.agents.getAgents();
40
+ console.log(`Available agents (${agents.length}):\n`);
41
+
42
+ for (const agent of agents) {
43
+ console.log(`- ${agent.name} (${agent.id})`);
44
+ console.log(` Description: ${agent.description?.substring(0, 100)}...`);
45
+ console.log(` Online: ${agent.isOnline}`);
46
+ console.log(` Rooms: ${agent.rooms?.join(", ") || "N/A"}`);
47
+ console.log();
48
+ }
49
+
50
+ await sdk.disconnect();
51
+ } catch (error) {
52
+ console.error("Error:", error);
53
+ }
54
+
55
+ process.exit(0);
56
+ }
57
+
58
+ listAgents().catch(console.error);
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Live Multi-Network Test
3
+ * Tests direct agent requests and coordinator requests across PEAQ, Base, and Avalanche
4
+ * Run with: npx tsx scripts/live-multi-network-test.ts
5
+ */
6
+
7
+ import { TeneoSDK, SDKConfigBuilder } from "../src";
8
+ import { SecurePrivateKey } from "../src/utils/secure-private-key";
9
+
10
+ const WS_URL = process.env.TENEO_WS_URL || "wss://backend.developer.chatroom.teneo-protocol.ai/ws";
11
+ const TEST_PRIVATE_KEY = process.env.TENEO_PRIVATE_KEY || "0xYOUR_PRIVATE_KEY_HERE";
12
+
13
+ interface TestResult {
14
+ network: string;
15
+ type: "direct" | "coordinator";
16
+ success: boolean;
17
+ response?: string;
18
+ txHash?: string;
19
+ error?: string;
20
+ duration: number;
21
+ }
22
+
23
+ const results: TestResult[] = [];
24
+
25
+ async function runTest() {
26
+ console.log("=".repeat(70));
27
+ console.log("LIVE MULTI-NETWORK TEST");
28
+ console.log("=".repeat(70));
29
+ console.log(`WebSocket: ${WS_URL}`);
30
+ console.log(`Networks: PEAQ (3338), Base (8453), Avalanche (43114)\n`);
31
+
32
+ const secureKey = new SecurePrivateKey(TEST_PRIVATE_KEY);
33
+
34
+ // Test each network
35
+ // Test all networks
36
+ const networks = ["peaq", "base", "avalanche"] as const;
37
+
38
+ for (const network of networks) {
39
+ console.log(`\n${"=".repeat(70)}`);
40
+ console.log(`TESTING NETWORK: ${network.toUpperCase()}`);
41
+ console.log("=".repeat(70));
42
+
43
+ let sdk: TeneoSDK | null = null;
44
+
45
+ try {
46
+ // Create SDK with network configuration
47
+ // Enable auto-approve for payments (wallet has USDC)
48
+ const config = new SDKConfigBuilder()
49
+ .withWebSocketUrl(WS_URL)
50
+ .withAuthentication(secureKey)
51
+ .withNetwork(network)
52
+ .withLogging("warn")
53
+ .withPayments({ autoApprove: true })
54
+ .build();
55
+
56
+ sdk = new TeneoSDK(config);
57
+
58
+ // Connect and authenticate
59
+ console.log(`\nConnecting to ${network}...`);
60
+ await sdk.connect();
61
+ console.log(`Connected and authenticated on ${network}`);
62
+
63
+ // Wait for agents list
64
+ await new Promise(resolve => setTimeout(resolve, 2000));
65
+
66
+ // Get the user's private room
67
+ const authState = sdk.getAuthState();
68
+ const privateRoom = authState.privateRoomIds?.[0] || authState.rooms?.[0] || "public";
69
+ console.log(`Using room: ${privateRoom}`);
70
+
71
+ // Test 1: Direct agent request
72
+ console.log(`\n--- Direct Request (@x-agent-enterprise-v2) ---`);
73
+ const directStart = Date.now();
74
+ try {
75
+ const directResponse = await sdk.sendMessage(
76
+ "@x-agent-enterprise-v2 user @elonmusk",
77
+ {
78
+ room: privateRoom,
79
+ waitForResponse: true,
80
+ timeout: 60000
81
+ }
82
+ );
83
+
84
+ const directDuration = Date.now() - directStart;
85
+ const directResult: TestResult = {
86
+ network,
87
+ type: "direct",
88
+ success: true,
89
+ response: typeof directResponse === "string"
90
+ ? directResponse.substring(0, 200) + "..."
91
+ : JSON.stringify(directResponse).substring(0, 200) + "...",
92
+ duration: directDuration
93
+ };
94
+
95
+ // Try to extract tx hash from response
96
+ if (typeof directResponse === "object" && directResponse !== null) {
97
+ const respObj = directResponse as Record<string, unknown>;
98
+ if (respObj.txHash) directResult.txHash = String(respObj.txHash);
99
+ if (respObj.payment_tx_hash) directResult.txHash = String(respObj.payment_tx_hash);
100
+ if (respObj.paymentTxHash) directResult.txHash = String(respObj.paymentTxHash);
101
+ // Check nested metadata
102
+ const metadata = respObj.metadata as Record<string, unknown> | undefined;
103
+ if (metadata?.txHash) directResult.txHash = String(metadata.txHash);
104
+ if (metadata?.payment_tx_hash) directResult.txHash = String(metadata.payment_tx_hash);
105
+ }
106
+ // Log full response for debugging
107
+ console.log("Full response:", JSON.stringify(directResponse, null, 2).substring(0, 1000));
108
+
109
+ results.push(directResult);
110
+ console.log(`Response (${directDuration}ms):`);
111
+ console.log(directResult.response);
112
+ if (directResult.txHash) console.log(`TX Hash: ${directResult.txHash}`);
113
+ } catch (error) {
114
+ const directDuration = Date.now() - directStart;
115
+ results.push({
116
+ network,
117
+ type: "direct",
118
+ success: false,
119
+ error: error instanceof Error ? error.message : String(error),
120
+ duration: directDuration
121
+ });
122
+ console.log(`Error (${directDuration}ms): ${error instanceof Error ? error.message : error}`);
123
+ }
124
+
125
+ // Wait between requests
126
+ await new Promise(resolve => setTimeout(resolve, 2000));
127
+
128
+ // Test 2: Coordinator request
129
+ console.log(`\n--- Coordinator Request ---`);
130
+ const coordStart = Date.now();
131
+ try {
132
+ const coordResponse = await sdk.sendMessage(
133
+ "give me 1 post from @elonmusk on x",
134
+ {
135
+ room: privateRoom,
136
+ waitForResponse: true,
137
+ timeout: 60000
138
+ }
139
+ );
140
+
141
+ const coordDuration = Date.now() - coordStart;
142
+ const coordResult: TestResult = {
143
+ network,
144
+ type: "coordinator",
145
+ success: true,
146
+ response: typeof coordResponse === "string"
147
+ ? coordResponse.substring(0, 200) + "..."
148
+ : JSON.stringify(coordResponse).substring(0, 200) + "...",
149
+ duration: coordDuration
150
+ };
151
+
152
+ // Try to extract tx hash from response
153
+ if (typeof coordResponse === "object" && coordResponse !== null) {
154
+ const respObj = coordResponse as Record<string, unknown>;
155
+ if (respObj.txHash) coordResult.txHash = String(respObj.txHash);
156
+ if (respObj.payment_tx_hash) coordResult.txHash = String(respObj.payment_tx_hash);
157
+ if (respObj.paymentTxHash) coordResult.txHash = String(respObj.paymentTxHash);
158
+ // Check nested metadata
159
+ const metadata = respObj.metadata as Record<string, unknown> | undefined;
160
+ if (metadata?.txHash) coordResult.txHash = String(metadata.txHash);
161
+ if (metadata?.payment_tx_hash) coordResult.txHash = String(metadata.payment_tx_hash);
162
+ }
163
+ // Log full response for debugging
164
+ console.log("Full response:", JSON.stringify(coordResponse, null, 2).substring(0, 1000));
165
+
166
+ results.push(coordResult);
167
+ console.log(`Response (${coordDuration}ms):`);
168
+ console.log(coordResult.response);
169
+ if (coordResult.txHash) console.log(`TX Hash: ${coordResult.txHash}`);
170
+ } catch (error) {
171
+ const coordDuration = Date.now() - coordStart;
172
+ results.push({
173
+ network,
174
+ type: "coordinator",
175
+ success: false,
176
+ error: error instanceof Error ? error.message : String(error),
177
+ duration: coordDuration
178
+ });
179
+ console.log(`Error (${coordDuration}ms): ${error instanceof Error ? error.message : error}`);
180
+ }
181
+
182
+ } catch (error) {
183
+ console.error(`Failed to test ${network}:`, error instanceof Error ? error.message : error);
184
+ } finally {
185
+ if (sdk) {
186
+ await sdk.disconnect();
187
+ console.log(`\nDisconnected from ${network}`);
188
+ }
189
+ }
190
+
191
+ // Wait between networks
192
+ await new Promise(resolve => setTimeout(resolve, 1000));
193
+ }
194
+
195
+ // Print summary
196
+ console.log(`\n${"=".repeat(70)}`);
197
+ console.log("TEST RESULTS SUMMARY");
198
+ console.log("=".repeat(70));
199
+
200
+ console.log("\n| Network | Type | Success | Duration | TX Hash |");
201
+ console.log("|------------|-------------|---------|----------|---------|");
202
+
203
+ for (const result of results) {
204
+ const txHash = result.txHash ? result.txHash.substring(0, 10) + "..." : "N/A";
205
+ console.log(
206
+ `| ${result.network.padEnd(10)} | ${result.type.padEnd(11)} | ${result.success ? "YES " : "NO "} | ${(result.duration + "ms").padEnd(8)} | ${txHash} |`
207
+ );
208
+ }
209
+
210
+ // Print detailed results
211
+ console.log("\n--- Detailed Results ---\n");
212
+ for (const result of results) {
213
+ console.log(`${result.network.toUpperCase()} - ${result.type}:`);
214
+ if (result.success) {
215
+ console.log(` Response: ${result.response}`);
216
+ if (result.txHash) console.log(` TX Hash: ${result.txHash}`);
217
+ } else {
218
+ console.log(` Error: ${result.error}`);
219
+ }
220
+ console.log();
221
+ }
222
+
223
+ // Exit
224
+ process.exit(results.every(r => r.success) ? 0 : 1);
225
+ }
226
+
227
+ runTest().catch(error => {
228
+ console.error("Test failed:", error);
229
+ process.exit(1);
230
+ });