@teneo-protocol/sdk 2.2.2 → 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 +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 +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 +360 -83
  128. package/dist/teneo-sdk.js.map +1 -1
  129. package/dist/types/config.d.ts +334 -25
  130. package/dist/types/config.d.ts.map +1 -1
  131. package/dist/types/config.js +114 -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 +4 -3
  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 +1 -1
  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 +401 -70
  207. package/src/types/config.test.ts +24 -4
  208. package/src/types/config.ts +123 -25
  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
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Payment Flow Example - Quote-Approve payment flow with Teneo SDK
3
+ * Demonstrates manual quote approval: request a quote, inspect pricing, then confirm.
4
+ * Shows multi-network payment support with x402 v2.5 settlement router integration.
5
+ *
6
+ * Usage:
7
+ * PRIVATE_KEY=0x... pnpm tsx examples/payment-flow.ts
8
+ */
9
+
10
+ import { TeneoSDK, SDKConfigBuilder, SecurePrivateKey, getSupportedNetworks } from "../src";
11
+
12
+ const WS_URL = process.env.WS_URL;
13
+ const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
14
+
15
+ async function main() {
16
+ if (!PRIVATE_KEY) {
17
+ console.error("Missing PRIVATE_KEY. Run with: PRIVATE_KEY=0x... pnpm tsx examples/payment-flow.ts");
18
+ process.exit(1);
19
+ }
20
+
21
+ const secureKey = new SecurePrivateKey(PRIVATE_KEY);
22
+
23
+ // Configure SDK with manual quote approval
24
+ const config = new SDKConfigBuilder()
25
+ .withWebSocketUrl(WS_URL)
26
+ .withAuthentication(secureKey)
27
+ .withPayments({
28
+ autoApprove: false, // Manual approval — we'll inspect quotes first
29
+ maxPricePerRequest: 1000000 // Max 1 USDC (in micro-units)
30
+ })
31
+ .withReconnection({ enabled: false })
32
+ .withLogging("warn")
33
+ .build();
34
+
35
+ const sdk = new TeneoSDK(config);
36
+
37
+ // --- Payment events ---
38
+
39
+ sdk.on("quote:received", (quote) => {
40
+ console.log(`[quote:received] Agent: ${quote.agentName}, Price: ${quote.pricing?.pricePerUnit} micro-USDC`);
41
+ });
42
+
43
+ sdk.on("payment:attached", (data) => {
44
+ console.log(`[payment:attached] Agent: ${data.agentId}, Amount: ${data.amount}, Command: ${data.command}`);
45
+ });
46
+
47
+ sdk.on("payment:blocked", (data) => {
48
+ console.log(`[payment:blocked] Agent ${data.agentId} wants ${data.agentPrice} but max is ${data.maxPrice}`);
49
+ });
50
+
51
+ sdk.on("payment:error", (err, agentId) => {
52
+ console.error(`[payment:error] Agent: ${agentId}, Error: ${err.message}`);
53
+ });
54
+
55
+ // --- General events ---
56
+
57
+ sdk.on("agent:response", (r) => {
58
+ console.log(`\n[agent:response] ${r.agentName || "Agent"}: ${r.humanized || r.content || JSON.stringify(r.raw)}`);
59
+ });
60
+
61
+ sdk.on("error", (e) => console.error("[error]", e.message));
62
+
63
+ try {
64
+ console.log("Connecting...");
65
+ await sdk.connect();
66
+ console.log("Connected!\n");
67
+
68
+ // Show supported networks (dynamically loaded from backend)
69
+ const networks = getSupportedNetworks();
70
+ console.log(`Supported payment networks: ${networks.join(", ")}\n`);
71
+
72
+ // Pick a room
73
+ const rooms = sdk.getRooms();
74
+ if (!rooms.length) {
75
+ console.log("No rooms available.");
76
+ return;
77
+ }
78
+
79
+ const roomId = rooms[0].id;
80
+ console.log(`Using room: ${rooms[0].name || roomId}\n`);
81
+
82
+ // --- Step 1: Request a quote ---
83
+ console.log("Requesting quote...");
84
+ const quote = await sdk.requestQuote(
85
+ "Analyze Bitcoin trends for the past week",
86
+ roomId
87
+ );
88
+
89
+ console.log("\nQuote received:");
90
+ console.log(` Task ID: ${quote.taskId}`);
91
+ console.log(` Agent: ${quote.agentName} (${quote.agentId})`);
92
+ console.log(` Price: ${quote.pricing.pricePerUnit} micro-USDC (${quote.pricing.priceType})`);
93
+ console.log(` Network: ${quote.pricing.network || "default"}`);
94
+ console.log(` Expires: ${quote.expiresAt}`);
95
+
96
+ // Show x402 v2.5 settlement router fields
97
+ if (quote.raw?.data) {
98
+ const data = quote.raw.data as any;
99
+ console.log("\nSettlement Router (x402 v2.5):");
100
+ console.log(` Router: ${data.settlement_router || "N/A"}`);
101
+ console.log(` Salt: ${data.salt || "N/A"}`);
102
+ console.log(` Fee: ${data.facilitator_fee || "N/A"}`);
103
+ console.log(` Hook: ${data.hook || "N/A"}`);
104
+ }
105
+
106
+ // --- Step 2: Decide whether to confirm ---
107
+ const MAX_ACCEPTABLE = 500000; // 0.5 USDC in micro-units
108
+
109
+ if (quote.pricing.pricePerUnit > MAX_ACCEPTABLE) {
110
+ console.log(`\nPrice ${quote.pricing.pricePerUnit} exceeds limit of ${MAX_ACCEPTABLE}. Skipping.`);
111
+ return;
112
+ }
113
+
114
+ // --- Step 3: Confirm the quote and wait for the response ---
115
+ console.log("\nConfirming quote and waiting for response...");
116
+ const response = await sdk.confirmQuote(quote.taskId, {
117
+ waitForResponse: true,
118
+ timeout: 60000
119
+ });
120
+
121
+ if (response?.humanized) {
122
+ console.log(`\nAgent response: ${response.humanized}`);
123
+ } else if (response?.raw) {
124
+ console.log(`\nAgent response (raw): ${JSON.stringify(response.raw, null, 2)}`);
125
+ } else {
126
+ console.log("\n(No response content)");
127
+ }
128
+
129
+ // --- Alternative: Check pending quote before confirming ---
130
+ // const pending = sdk.getPendingQuote(quote.taskId);
131
+ // if (pending) {
132
+ // console.log(`Still pending: ${pending.agentName}`);
133
+ // }
134
+
135
+ } catch (err) {
136
+ console.error("Error:", err);
137
+ } finally {
138
+ sdk.disconnect();
139
+ sdk.destroy();
140
+ }
141
+ }
142
+
143
+ main();
@@ -125,7 +125,6 @@ PRIVATE_KEY=0x...your-private-key
125
125
  WALLET_ADDRESS=0x...your-wallet-address
126
126
 
127
127
  # Optional
128
- DEFAULT_ROOM=general
129
128
  PORT=3000
130
129
 
131
130
  # Security Features
@@ -147,7 +146,6 @@ const secureKey = new SecurePrivateKey(PRIVATE_KEY);
147
146
  const config = new SDKConfigBuilder()
148
147
  .withWebSocketUrl(WS_URL)
149
148
  .withAuthentication(secureKey, WALLET_ADDRESS) // Use encrypted key
150
- .withAutoJoinRooms([DEFAULT_ROOM])
151
149
  .withReconnection({ enabled: true, delay: 5000, maxAttempts: 10 })
152
150
  // REL-3: Custom retry strategies for production
153
151
  .withReconnectionStrategy({
@@ -208,7 +206,7 @@ const config = new SDKConfigBuilder()
208
206
  {
209
207
  "agent": "weather-agent",
210
208
  "command": "weather New York",
211
- "room": "general"
209
+ "room": "your-room-id"
212
210
  }
213
211
  ```
214
212
 
@@ -223,7 +221,7 @@ const config = new SDKConfigBuilder()
223
221
  - `POST /api/room/subscribe` - Subscribe to a room (v1)
224
222
  ```json
225
223
  {
226
- "roomId": "tech-support"
224
+ "roomId": "your-room-id"
227
225
  }
228
226
  ```
229
227
  - `POST /api/room/unsubscribe` - Unsubscribe from a room (v1)
@@ -415,13 +413,13 @@ curl http://localhost:3000/api/agents/search/status/online
415
413
 
416
414
  ```typescript
417
415
  // Fast capability search
418
- const weatherAgents = sdk.findAgentsByCapability("weather-forecast");
416
+ const weatherAgents = sdk.findAvailableAgentsByCapability("weather-forecast");
419
417
 
420
418
  // Fast partial name search
421
- const agentsWithWeather = sdk.findAgentsByName("weather");
419
+ const agentsWithWeather = sdk.findAvailableAgentsByName("weather");
422
420
 
423
421
  // Fast status filtering
424
- const onlineAgents = sdk.findAgentsByStatus("online");
422
+ const onlineAgents = sdk.findAvailableAgentsByStatus("online");
425
423
  ```
426
424
 
427
425
  ### Configurable Retry Strategies (REL-3)
@@ -536,7 +534,7 @@ The `/health` endpoint returns comprehensive status:
536
534
  },
537
535
  "rooms": {
538
536
  "count": 3,
539
- "subscribedRooms": ["general", "announcements"]
537
+ "subscribedRooms": ["room-id-1", "room-id-2"]
540
538
  }
541
539
  }
542
540
  ```
@@ -100,7 +100,7 @@ async function initializeSDK() {
100
100
  backoffMultiplier: 2
101
101
  })
102
102
  .withResponseFormat({ format: "both", includeMetadata: true })
103
- .withLogging("debug")
103
+ .withLogging("info")
104
104
  .withCache(true, 300000, 100)
105
105
  // CB-4: Message deduplication to prevent duplicate processing
106
106
  .withMessageDeduplication(
@@ -495,7 +495,19 @@ app.get("/api/deduplication", (c) => {
495
495
  app.post("/webhook", async (c) => {
496
496
  const payload = await c.req.json();
497
497
 
498
- console.log("[WEBHOOK] Received:", payload.event);
498
+ // Filter out spammy admin broadcast events
499
+ const ignoredEvents = [
500
+ 'user_count', // Admin-only: User count updates
501
+ 'user_authenticated', // Broadcast when ANY user connects
502
+ 'rate_limit_notification', // Rate limit warnings (usually not needed in webhooks)
503
+ ];
504
+
505
+ if (ignoredEvents.includes(payload.event)) {
506
+ // Silently ignore these events - don't log, don't store, just return OK
507
+ return c.json({ status: "ignored" });
508
+ }
509
+
510
+ console.log("[WEBHOOK] Received:", payload.event, "| Data:", JSON.stringify(payload.data).slice(0, 100));
499
511
 
500
512
  // Store webhook for display
501
513
  recentWebhooks.unshift({
@@ -615,7 +627,7 @@ app.get("/api/agents/search/capability/:capability", (c) => {
615
627
 
616
628
  try {
617
629
  const capability = c.req.param("capability");
618
- const agents = sdk.findAgentsByCapability(capability);
630
+ const agents = sdk.findAvailableAgentsByCapability(capability);
619
631
  return c.json({
620
632
  capability,
621
633
  count: agents.length,
@@ -634,7 +646,7 @@ app.get("/api/agents/search/name/:name", (c) => {
634
646
 
635
647
  try {
636
648
  const name = c.req.param("name");
637
- const agents = sdk.findAgentsByName(name);
649
+ const agents = sdk.findAvailableAgentsByName(name);
638
650
  return c.json({
639
651
  query: name,
640
652
  count: agents.length,
@@ -653,7 +665,7 @@ app.get("/api/agents/search/status/:status", (c) => {
653
665
 
654
666
  try {
655
667
  const status = c.req.param("status");
656
- const agents = sdk.findAgentsByStatus(status);
668
+ const agents = sdk.findAvailableAgentsByStatus(status);
657
669
  return c.json({
658
670
  status,
659
671
  count: agents.length,
@@ -788,7 +800,7 @@ app.post("/api/room/join", async (c) => {
788
800
  return c.json({ error: "Room ID is required" }, 400);
789
801
  }
790
802
 
791
- await sdk.subscribeToRoom(roomId);
803
+ await sdk.subscribeToPublicRoom(roomId);
792
804
  return c.json({ success: true });
793
805
  } catch (error: any) {
794
806
  return c.json({ error: error.message }, 500);
@@ -808,7 +820,7 @@ app.post("/api/room/leave", async (c) => {
808
820
  return c.json({ error: "Room ID is required" }, 400);
809
821
  }
810
822
 
811
- await sdk.unsubscribeFromRoom(roomId);
823
+ await sdk.unsubscribeFromPublicRoom(roomId);
812
824
  return c.json({ success: true });
813
825
  } catch (error: any) {
814
826
  return c.json({ error: error.message }, 500);
@@ -1004,12 +1016,12 @@ app.get("/api/v2/rooms/:roomId/agents/:agentId/check", (c) => {
1004
1016
 
1005
1017
  const roomId = c.req.param("roomId");
1006
1018
  const agentId = c.req.param("agentId");
1007
- const isInRoom = sdk.isAgentInRoom(roomId, agentId);
1019
+ const inRoom = sdk.checkAgentInRoom(roomId, agentId);
1008
1020
 
1009
1021
  return c.json({
1010
1022
  roomId,
1011
1023
  agentId,
1012
- inRoom: isInRoom,
1024
+ inRoom: inRoom,
1013
1025
  cached: true
1014
1026
  });
1015
1027
  });
@@ -1021,7 +1033,7 @@ app.get("/api/v2/rooms/:id/agents/count", (c) => {
1021
1033
  }
1022
1034
 
1023
1035
  const roomId = c.req.param("id");
1024
- const count = sdk.getRoomAgentCount(roomId);
1036
+ const count = sdk.getCachedRoomAgentCount(roomId);
1025
1037
 
1026
1038
  return c.json({
1027
1039
  roomId,
@@ -84,7 +84,7 @@ async function main() {
84
84
  console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
85
85
  console.log("🔍 Querying Specific Room");
86
86
  console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
87
- const room = sdk.getRoomById(newRooms[0].id);
87
+ const room = sdk.getRoom(newRooms[0].id);
88
88
  if (room) {
89
89
  console.log(`Room ID: ${room.id}`);
90
90
  console.log(`Name: ${room.name}`);
@@ -236,7 +236,7 @@ async function createSampleRooms(sdk: TeneoSDK) {
236
236
 
237
237
  async function updateRoomExample(sdk: TeneoSDK, roomId: string) {
238
238
  try {
239
- const originalRoom = sdk.getRoomById(roomId);
239
+ const originalRoom = sdk.getRoom(roomId);
240
240
  if (!originalRoom) {
241
241
  console.log(" ⚠️ Room not found");
242
242
  return;
@@ -16,7 +16,6 @@ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
16
16
  // Load configuration from environment
17
17
  const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
18
18
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
19
- const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
20
19
 
21
20
  async function main() {
22
21
  console.log("🚀 Example 1: Basic SDK Connection\n");
@@ -30,7 +29,6 @@ async function main() {
30
29
 
31
30
  console.log("📋 Configuration:");
32
31
  console.log(` WebSocket URL: ${WS_URL}`);
33
- console.log(` Default Room: ${DEFAULT_ROOM}`);
34
32
  console.log(` Private Key: ${PRIVATE_KEY.substring(0, 10)}...`);
35
33
  console.log("");
36
34
 
@@ -39,7 +37,6 @@ async function main() {
39
37
  const config = new SDKConfigBuilder()
40
38
  .withWebSocketUrl(WS_URL)
41
39
  .withAuthentication(PRIVATE_KEY)
42
- // .withAutoJoinRooms([DEFAULT_ROOM])
43
40
  .withLogging("info")
44
41
  .withReconnection({ enabled: true, delay: 5000, maxAttempts: 3 })
45
42
  .build();
@@ -16,7 +16,6 @@ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
16
16
  // Load configuration from environment
17
17
  const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
18
18
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
19
- const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
20
19
 
21
20
  async function main() {
22
21
  console.log("🚀 Example 2: List Available Agents\n");
@@ -30,7 +29,6 @@ async function main() {
30
29
  const config = new SDKConfigBuilder()
31
30
  .withWebSocketUrl(WS_URL)
32
31
  .withAuthentication(PRIVATE_KEY)
33
- // .withAutoJoinRooms([DEFAULT_ROOM])
34
32
  .withLogging("info")
35
33
  .build();
36
34
 
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * This example demonstrates:
5
5
  * - Finding a specific agent by ID or name
6
- * - Sending a direct command to an agent (bypassing coordinator)
6
+ * - Sending a direct command to an agent
7
+ * - Direct commands work in all environments (required when no coordinator)
7
8
  * - Waiting for and receiving agent responses
8
9
  * - Handling response formats (raw, humanized, both)
9
10
  *
@@ -17,7 +18,6 @@ import { TeneoSDK, SDKConfigBuilder, FormattedResponse } from "../../dist/index.
17
18
  // Load configuration from environment
18
19
  const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
19
20
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
20
- const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
21
21
 
22
22
  async function main() {
23
23
  console.log("🚀 Example 3: Pick and Communicate with Specific Agent\n");
@@ -34,7 +34,6 @@ async function main() {
34
34
  const config = new SDKConfigBuilder()
35
35
  .withWebSocketUrl(WS_URL)
36
36
  .withAuthentication(PRIVATE_KEY)
37
- // .withAutoJoinRooms([DEFAULT_ROOM])
38
37
  .withResponseFormat({ format: "both", includeMetadata: true })
39
38
  .withLogging("info")
40
39
  .build();
@@ -143,7 +142,7 @@ async function main() {
143
142
  {
144
143
  agent: selectedAgent.id,
145
144
  command: command,
146
- room: DEFAULT_ROOM
145
+ room: "room-id"
147
146
  },
148
147
  true
149
148
  ); // waitForResponse = true
@@ -17,7 +17,6 @@ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
17
17
  // Load configuration from environment
18
18
  const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
19
19
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
20
- const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
21
20
 
22
21
  async function main() {
23
22
  console.log("🚀 Example 4: Find Agents by Capability\n");
@@ -31,7 +30,6 @@ async function main() {
31
30
  const config = new SDKConfigBuilder()
32
31
  .withWebSocketUrl(WS_URL)
33
32
  .withAuthentication(PRIVATE_KEY)
34
- // .withAutoJoinRooms([DEFAULT_ROOM])
35
33
  .withLogging("info")
36
34
  .build();
37
35
 
@@ -96,7 +94,7 @@ async function main() {
96
94
  for (const capability of testCapabilities) {
97
95
  console.log(`\n🔍 Searching for capability: "${capability}"`);
98
96
  const startTime = performance.now();
99
- const agentsWithCap = sdk.findAgentsByCapability(capability);
97
+ const agentsWithCap = sdk.findAvailableAgentsByCapability(capability);
100
98
  const duration = performance.now() - startTime;
101
99
 
102
100
  if (agentsWithCap.length > 0) {
@@ -121,7 +119,7 @@ async function main() {
121
119
 
122
120
  console.log("\n🔍 Online agents:");
123
121
  const startTimeOnline = performance.now();
124
- const onlineAgents = sdk.findAgentsByStatus("online");
122
+ const onlineAgents = sdk.findAvailableAgentsByStatus("online");
125
123
  const durationOnline = performance.now() - startTimeOnline;
126
124
  console.log(`✅ Found ${onlineAgents.length} online agents (${durationOnline.toFixed(3)}ms):`);
127
125
  onlineAgents.forEach((agent) => {
@@ -130,7 +128,7 @@ async function main() {
130
128
 
131
129
  console.log("\n🔍 Offline agents:");
132
130
  const startTimeOffline = performance.now();
133
- const offlineAgents = sdk.findAgentsByStatus("offline");
131
+ const offlineAgents = sdk.findAvailableAgentsByStatus("offline");
134
132
  const durationOffline = performance.now() - startTimeOffline;
135
133
  console.log(
136
134
  `✅ Found ${offlineAgents.length} offline agents (${durationOffline.toFixed(3)}ms):`
@@ -147,7 +145,7 @@ async function main() {
147
145
  for (const term of searchTerms) {
148
146
  console.log(`\n🔍 Searching for name containing: "${term}"`);
149
147
  const startTime = performance.now();
150
- const foundAgents = sdk.findAgentsByName(term);
148
+ const foundAgents = sdk.findAvailableAgentsByName(term);
151
149
  const duration = performance.now() - startTime;
152
150
 
153
151
  if (foundAgents.length > 0) {
@@ -176,12 +174,12 @@ async function main() {
176
174
  console.log("Strategy: Find online agents with social-media or twitter capabilities\n");
177
175
 
178
176
  // First, try to find by specific capabilities
179
- let candidates = sdk.findAgentsByCapability("social-media");
177
+ let candidates = sdk.findAvailableAgentsByCapability("social-media");
180
178
  if (candidates.length === 0) {
181
- candidates = sdk.findAgentsByCapability("twitter");
179
+ candidates = sdk.findAvailableAgentsByCapability("twitter");
182
180
  }
183
181
  if (candidates.length === 0) {
184
- candidates = sdk.findAgentsByCapability("x-platform");
182
+ candidates = sdk.findAvailableAgentsByCapability("x-platform");
185
183
  }
186
184
 
187
185
  // Filter to only online agents
@@ -191,9 +189,9 @@ async function main() {
191
189
  if (candidates.length === 0) {
192
190
  console.log("⚠️ No capability match, trying name search...");
193
191
  const nameResults = sdk
194
- .findAgentsByName("twitter")
195
- .concat(sdk.findAgentsByName("x platform"))
196
- .concat(sdk.findAgentsByName("social"));
192
+ .findAvailableAgentsByName("twitter")
193
+ .concat(sdk.findAvailableAgentsByName("x platform"))
194
+ .concat(sdk.findAvailableAgentsByName("social"));
197
195
 
198
196
  // Remove duplicates and filter online
199
197
  const uniqueIds = new Set<string>();
@@ -28,7 +28,6 @@ import type { Request, Response } from "express";
28
28
  // Load configuration from environment
29
29
  const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
30
30
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
31
- const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
32
31
  const WEBHOOK_PORT = parseInt(process.env.WEBHOOK_PORT || "3001");
33
32
  const WEBHOOK_SINK_PORT = parseInt(process.env.WEBHOOK_SINK_PORT || "3000");
34
33
 
@@ -130,7 +129,6 @@ async function main() {
130
129
  const config = new SDKConfigBuilder()
131
130
  .withWebSocketUrl(WS_URL)
132
131
  .withAuthentication(PRIVATE_KEY)
133
- // .withAutoJoinRooms([DEFAULT_ROOM])
134
132
  .withResponseFormat({ format: "both", includeMetadata: true })
135
133
  .withLogging("info")
136
134
  .build();
@@ -206,7 +204,7 @@ async function main() {
206
204
  {
207
205
  agent: agent.id,
208
206
  command: "hello webhook test",
209
- room: DEFAULT_ROOM
207
+ room: "room-id"
210
208
  },
211
209
  false
212
210
  ); // Don't wait for response
@@ -243,7 +241,7 @@ async function main() {
243
241
  {
244
242
  agent: testAgents[0].id,
245
243
  command: "test retry",
246
- room: DEFAULT_ROOM
244
+ room: "room-id"
247
245
  },
248
246
  false
249
247
  );
@@ -23,7 +23,6 @@ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
23
23
  // Load configuration from environment
24
24
  const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
25
25
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
26
- const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
27
26
  const PORT = parseInt(process.env.PORT || "3000");
28
27
 
29
28
  // Validate configuration
@@ -40,13 +39,11 @@ app.use(express.json());
40
39
  console.log("🚀 Initializing Teneo API Server\n");
41
40
  console.log("📋 Configuration:");
42
41
  console.log(` WebSocket: ${WS_URL}`);
43
- console.log(` Room: ${DEFAULT_ROOM}`);
44
42
  console.log(` Port: ${PORT}\n`);
45
43
 
46
44
  const config = new SDKConfigBuilder()
47
45
  .withWebSocketUrl(WS_URL)
48
46
  .withAuthentication(PRIVATE_KEY)
49
- // .withAutoJoinRooms([DEFAULT_ROOM])
50
47
  .withResponseFormat({ format: "both", includeMetadata: true })
51
48
  .withReconnection({ enabled: true, delay: 5000, maxAttempts: 10 })
52
49
  .withLogging("info")
@@ -182,7 +179,7 @@ app.get("/agents/:id", (req: Request, res: Response) => {
182
179
  app.get("/agents/capability/:capability", (req: Request, res: Response) => {
183
180
  try {
184
181
  const { capability } = req.params;
185
- const agents = sdk.findAgentsByCapability(capability);
182
+ const agents = sdk.findAvailableAgentsByCapability(capability);
186
183
 
187
184
  res.json({
188
185
  success: true,
@@ -206,6 +203,13 @@ app.get("/agents/capability/:capability", (req: Request, res: Response) => {
206
203
  * POST /message
207
204
  * Send a message to an agent
208
205
  * Body: { message: string, agent?: string, waitForResponse?: boolean, timeout?: number }
206
+ *
207
+ * Two approaches:
208
+ * 1. WITH AGENT: Direct command (required in non-coordinator environments)
209
+ * Example: { "message": "search bitcoin 5", "agent": "X Platform Agent" }
210
+ *
211
+ * 2. WITHOUT AGENT: Coordinator routing (only works in coordinator environments)
212
+ * Example: { "message": "Get bitcoin info" }
209
213
  */
210
214
  app.post("/message", async (req: Request, res: Response) => {
211
215
  try {
@@ -228,12 +232,12 @@ app.post("/message", async (req: Request, res: Response) => {
228
232
  const startTime = Date.now();
229
233
 
230
234
  if (agent) {
231
- // Send to specific agent
235
+ // Send to specific agent (direct command)
232
236
  const response = await sdk.sendDirectCommand(
233
237
  {
234
238
  agent,
235
239
  command: message,
236
- room: DEFAULT_ROOM
240
+ room: "room-id"
237
241
  },
238
242
  waitForResponse
239
243
  );
@@ -260,7 +264,7 @@ app.post("/message", async (req: Request, res: Response) => {
260
264
  } else {
261
265
  // Send via coordinator (will auto-select agent)
262
266
  const response = await sdk.sendMessage(message, {
263
- room: DEFAULT_ROOM,
267
+ room: "room-id",
264
268
  waitForResponse,
265
269
  timeout
266
270
  });
@@ -318,7 +322,7 @@ app.get("/rooms", (_req: Request, res: Response) => {
318
322
  app.post("/rooms/:roomId/subscribe", async (req: Request, res: Response) => {
319
323
  try {
320
324
  const { roomId } = req.params;
321
- await sdk.subscribeToRoom(roomId);
325
+ await sdk.subscribeToPublicRoom(roomId);
322
326
 
323
327
  res.json({
324
328
  success: true,
@@ -340,7 +344,7 @@ app.post("/rooms/:roomId/subscribe", async (req: Request, res: Response) => {
340
344
  app.post("/rooms/:roomId/unsubscribe", async (req: Request, res: Response) => {
341
345
  try {
342
346
  const { roomId } = req.params;
343
- await sdk.unsubscribeFromRoom(roomId);
347
+ await sdk.unsubscribeFromPublicRoom(roomId);
344
348
 
345
349
  res.json({
346
350
  success: true,
@@ -17,7 +17,6 @@ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
17
17
  // Load configuration from environment
18
18
  const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
19
19
  const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
20
- const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
21
20
 
22
21
  // Event counters for statistics
23
22
  const eventStats = {
@@ -57,7 +56,6 @@ async function main() {
57
56
  const config = new SDKConfigBuilder()
58
57
  .withWebSocketUrl(WS_URL)
59
58
  .withAuthentication(PRIVATE_KEY)
60
- // .withAutoJoinRooms([DEFAULT_ROOM])
61
59
  .withResponseFormat({ format: "both", includeMetadata: true })
62
60
  .withLogging("info")
63
61
  .build();
@@ -213,11 +211,6 @@ async function main() {
213
211
  console.log(`🏠 [ROOM] Unsubscribed from room: ${data.roomId}`);
214
212
  });
215
213
 
216
- sdk.on("room:list", (rooms) => {
217
- eventStats.room++;
218
- console.log(`🏠 [ROOM] Room list received: ${rooms.length} rooms`);
219
- });
220
-
221
214
  // ============================================================================
222
215
  // WEBHOOK EVENTS
223
216
  // ============================================================================
@@ -325,11 +318,6 @@ async function main() {
325
318
  }
326
319
  });
327
320
 
328
- sdk.on("warning", (warning) => {
329
- eventStats.error++;
330
- console.warn("⚠️ [WARNING]", warning);
331
- });
332
-
333
321
  // ============================================================================
334
322
  // CONNECT AND TRIGGER EVENTS
335
323
  // ============================================================================
@@ -361,7 +349,7 @@ async function main() {
361
349
  {
362
350
  agent: testAgent.id,
363
351
  command: "hello event listener test",
364
- room: DEFAULT_ROOM
352
+ room: "room-id"
365
353
  },
366
354
  false
367
355
  );