@teneo-protocol/sdk 1.0.0 → 2.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 (211) hide show
  1. package/.github/workflows/publish-npm.yml +8 -6
  2. package/CHANGELOG.md +265 -0
  3. package/README.md +406 -53
  4. package/dist/core/websocket-client.d.ts +13 -0
  5. package/dist/core/websocket-client.d.ts.map +1 -1
  6. package/dist/core/websocket-client.js +34 -3
  7. package/dist/core/websocket-client.js.map +1 -1
  8. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
  9. package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
  10. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +70 -0
  11. package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
  12. package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
  13. package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
  14. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +904 -0
  15. package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
  16. package/dist/handlers/message-handlers/agent-status-update-handler.js +51 -0
  17. package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
  18. package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
  19. package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
  20. package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
  21. package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
  22. package/dist/handlers/message-handlers/auth-message-handler.js +65 -5
  23. package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
  24. package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
  25. package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
  26. package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
  27. package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
  28. package/dist/handlers/message-handlers/auth-success-handler.js +46 -4
  29. package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
  30. package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
  31. package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
  32. package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
  33. package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
  34. package/dist/handlers/message-handlers/index.d.ts +5 -0
  35. package/dist/handlers/message-handlers/index.d.ts.map +1 -1
  36. package/dist/handlers/message-handlers/index.js +23 -1
  37. package/dist/handlers/message-handlers/index.js.map +1 -1
  38. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +877 -0
  39. package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
  40. package/dist/handlers/message-handlers/list-available-agents-handler.js +38 -0
  41. package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
  42. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +886 -0
  43. package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
  44. package/dist/handlers/message-handlers/list-room-agents-handler.js +51 -0
  45. package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
  46. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +178 -89
  47. package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
  48. package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
  49. package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
  50. package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
  51. package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
  52. package/dist/handlers/message-handlers/regular-message-handler.js +1 -0
  53. package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
  54. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
  55. package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
  56. package/dist/handlers/message-handlers/room-operation-response-handler.js +92 -0
  57. package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
  58. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
  59. package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
  60. package/dist/handlers/message-handlers/types.d.ts +2 -0
  61. package/dist/handlers/message-handlers/types.d.ts.map +1 -1
  62. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
  63. package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
  64. package/dist/managers/agent-room-manager.d.ts +222 -0
  65. package/dist/managers/agent-room-manager.d.ts.map +1 -0
  66. package/dist/managers/agent-room-manager.js +508 -0
  67. package/dist/managers/agent-room-manager.js.map +1 -0
  68. package/dist/managers/index.d.ts +2 -0
  69. package/dist/managers/index.d.ts.map +1 -1
  70. package/dist/managers/index.js +5 -1
  71. package/dist/managers/index.js.map +1 -1
  72. package/dist/managers/message-router.d.ts +1 -1
  73. package/dist/managers/message-router.d.ts.map +1 -1
  74. package/dist/managers/message-router.js +41 -4
  75. package/dist/managers/message-router.js.map +1 -1
  76. package/dist/managers/room-management-manager.d.ts +213 -0
  77. package/dist/managers/room-management-manager.d.ts.map +1 -0
  78. package/dist/managers/room-management-manager.js +440 -0
  79. package/dist/managers/room-management-manager.js.map +1 -0
  80. package/dist/managers/room-manager.d.ts +4 -4
  81. package/dist/managers/room-manager.d.ts.map +1 -1
  82. package/dist/managers/room-manager.js +1 -1
  83. package/dist/managers/room-manager.js.map +1 -1
  84. package/dist/teneo-sdk.d.ts +362 -14
  85. package/dist/teneo-sdk.d.ts.map +1 -1
  86. package/dist/teneo-sdk.js +497 -7
  87. package/dist/teneo-sdk.js.map +1 -1
  88. package/dist/types/config.d.ts +63 -54
  89. package/dist/types/config.d.ts.map +1 -1
  90. package/dist/types/config.js +9 -5
  91. package/dist/types/config.js.map +1 -1
  92. package/dist/types/error-codes.d.ts +2 -0
  93. package/dist/types/error-codes.d.ts.map +1 -1
  94. package/dist/types/error-codes.js +3 -0
  95. package/dist/types/error-codes.js.map +1 -1
  96. package/dist/types/events.d.ts +132 -68
  97. package/dist/types/events.d.ts.map +1 -1
  98. package/dist/types/events.js.map +1 -1
  99. package/dist/types/index.d.ts +1 -1
  100. package/dist/types/index.d.ts.map +1 -1
  101. package/dist/types/index.js +27 -2
  102. package/dist/types/index.js.map +1 -1
  103. package/dist/types/messages.d.ts +11396 -2559
  104. package/dist/types/messages.d.ts.map +1 -1
  105. package/dist/types/messages.js +294 -27
  106. package/dist/types/messages.js.map +1 -1
  107. package/dist/types/validation.d.ts.map +1 -1
  108. package/dist/types/validation.js +1 -1
  109. package/dist/types/validation.js.map +1 -1
  110. package/dist/utils/bounded-queue.d.ts +1 -1
  111. package/dist/utils/bounded-queue.js +6 -6
  112. package/dist/utils/circuit-breaker.d.ts.map +1 -1
  113. package/dist/utils/circuit-breaker.js.map +1 -1
  114. package/dist/utils/event-waiter.d.ts.map +1 -1
  115. package/dist/utils/event-waiter.js +2 -1
  116. package/dist/utils/event-waiter.js.map +1 -1
  117. package/dist/utils/rate-limiter.d.ts.map +1 -1
  118. package/dist/utils/rate-limiter.js +4 -6
  119. package/dist/utils/rate-limiter.js.map +1 -1
  120. package/dist/utils/secure-private-key.d.ts.map +1 -1
  121. package/dist/utils/secure-private-key.js +9 -15
  122. package/dist/utils/secure-private-key.js.map +1 -1
  123. package/dist/utils/signature-verifier.d.ts +2 -2
  124. package/dist/utils/signature-verifier.d.ts.map +1 -1
  125. package/dist/utils/signature-verifier.js +5 -5
  126. package/dist/utils/signature-verifier.js.map +1 -1
  127. package/examples/.env.example +1 -1
  128. package/examples/agent-room-management-example.ts +334 -0
  129. package/examples/claude-agent-x-follower/.env.example +117 -0
  130. package/examples/claude-agent-x-follower/QUICKSTART.md +243 -0
  131. package/examples/claude-agent-x-follower/README.md +540 -0
  132. package/examples/claude-agent-x-follower/index.ts +248 -0
  133. package/examples/claude-agent-x-follower/package.json +37 -0
  134. package/examples/claude-agent-x-follower/tsconfig.json +20 -0
  135. package/examples/n8n-teneo/.env.example +127 -0
  136. package/examples/n8n-teneo/Dockerfile +42 -0
  137. package/examples/n8n-teneo/README.md +564 -0
  138. package/examples/n8n-teneo/docker-compose.yml +71 -0
  139. package/examples/n8n-teneo/index.ts +177 -0
  140. package/examples/n8n-teneo/package.json +22 -0
  141. package/examples/n8n-teneo/tsconfig.json +12 -0
  142. package/examples/n8n-teneo/workflows/x-timeline.json +66 -0
  143. package/examples/openai-teneo/.env.example +130 -0
  144. package/examples/openai-teneo/README.md +635 -0
  145. package/examples/openai-teneo/index.ts +280 -0
  146. package/examples/openai-teneo/package.json +24 -0
  147. package/examples/openai-teneo/tsconfig.json +16 -0
  148. package/examples/production-dashboard/.env.example +5 -3
  149. package/examples/production-dashboard/README.md +839 -0
  150. package/examples/production-dashboard/pnpm-lock.yaml +92 -0
  151. package/examples/production-dashboard/public/dashboard.html +1150 -504
  152. package/examples/production-dashboard/server.ts +428 -12
  153. package/examples/room-management-example.ts +285 -0
  154. package/examples/usage/.env.example +17 -0
  155. package/examples/usage/01-connect.ts +116 -0
  156. package/examples/usage/02-list-agents.ts +153 -0
  157. package/examples/usage/03-pick-agent.ts +201 -0
  158. package/examples/usage/04-find-by-capability.ts +237 -0
  159. package/examples/usage/05-webhook-example.ts +319 -0
  160. package/examples/usage/06-simple-api-server.ts +396 -0
  161. package/examples/usage/07-event-listener.ts +402 -0
  162. package/examples/usage/README.md +383 -0
  163. package/examples/usage/package.json +42 -0
  164. package/package.json +13 -3
  165. package/src/core/websocket-client.ts +43 -9
  166. package/src/formatters/response-formatter.test.ts +8 -2
  167. package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +83 -0
  168. package/src/handlers/message-handlers/agent-status-update-handler.ts +58 -0
  169. package/src/handlers/message-handlers/auth-message-handler.ts +73 -5
  170. package/src/handlers/message-handlers/auth-success-handler.ts +58 -6
  171. package/src/handlers/message-handlers/index.ts +19 -0
  172. package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
  173. package/src/handlers/message-handlers/list-room-agents-handler.ts +61 -0
  174. package/src/handlers/message-handlers/regular-message-handler.ts +1 -0
  175. package/src/handlers/message-handlers/room-operation-response-handler.ts +105 -0
  176. package/src/handlers/message-handlers/types.ts +6 -0
  177. package/src/handlers/webhook-handler.test.ts +13 -10
  178. package/src/managers/agent-room-manager.ts +609 -0
  179. package/src/managers/index.ts +2 -0
  180. package/src/managers/message-router.ts +48 -6
  181. package/src/managers/room-management-manager.ts +523 -0
  182. package/src/managers/room-manager.ts +12 -6
  183. package/src/teneo-sdk.ts +543 -10
  184. package/src/types/config.ts +13 -6
  185. package/src/types/error-codes.ts +4 -0
  186. package/src/types/events.ts +24 -0
  187. package/src/types/index.ts +55 -0
  188. package/src/types/messages.ts +374 -41
  189. package/src/types/validation.ts +4 -1
  190. package/src/utils/bounded-queue.ts +9 -9
  191. package/src/utils/circuit-breaker.ts +4 -1
  192. package/src/utils/deduplication-cache.test.ts +2 -6
  193. package/src/utils/event-waiter.test.ts +4 -1
  194. package/src/utils/event-waiter.ts +5 -7
  195. package/src/utils/rate-limiter.test.ts +5 -17
  196. package/src/utils/rate-limiter.ts +6 -9
  197. package/src/utils/secure-private-key.test.ts +66 -59
  198. package/src/utils/secure-private-key.ts +10 -16
  199. package/src/utils/signature-verifier.test.ts +75 -70
  200. package/src/utils/signature-verifier.ts +7 -8
  201. package/src/utils/ssrf-validator.test.ts +3 -3
  202. package/tests/integration/room-management.test.ts +514 -0
  203. package/tests/integration/websocket.test.ts +1 -1
  204. package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +394 -0
  205. package/tests/unit/handlers/agent-status-update-handler.test.ts +407 -0
  206. package/tests/unit/handlers/auth-success-handler-rooms.test.ts +699 -0
  207. package/tests/unit/handlers/list-available-agents-handler.test.ts +256 -0
  208. package/tests/unit/handlers/list-room-agents-handler.test.ts +294 -0
  209. package/tests/unit/handlers/room-operation-response-handler.test.ts +527 -0
  210. package/tests/unit/managers/agent-room-manager.test.ts +534 -0
  211. package/tests/unit/managers/room-management-manager.test.ts +438 -0
@@ -0,0 +1,402 @@
1
+ /**
2
+ * Example 7: Event Listener
3
+ *
4
+ * This example demonstrates:
5
+ * - Listening to all 30+ SDK events
6
+ * - Event-driven architecture patterns
7
+ * - Real-time monitoring and logging
8
+ * - Event filtering and processing
9
+ * - Building reactive applications
10
+ *
11
+ * Run: npx tsx examples/usage/07-event-listener.ts
12
+ */
13
+
14
+ import "dotenv/config";
15
+ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
16
+
17
+ // Load configuration from environment
18
+ const WS_URL =
19
+ process.env.WS_URL || "wss://your-teneo-server.com/ws";
20
+ const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
21
+ const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
22
+
23
+ // Event counters for statistics
24
+ const eventStats = {
25
+ connection: 0,
26
+ auth: 0,
27
+ message: 0,
28
+ agent: 0,
29
+ room: 0,
30
+ webhook: 0,
31
+ signature: 0,
32
+ error: 0,
33
+ other: 0
34
+ };
35
+
36
+ function categorizeEvent(eventName: string): keyof typeof eventStats {
37
+ if (eventName.startsWith("connection:")) return "connection";
38
+ if (eventName.startsWith("auth:")) return "auth";
39
+ if (eventName.startsWith("message:")) return "message";
40
+ if (eventName.startsWith("agent:")) return "agent";
41
+ if (eventName.startsWith("room:")) return "room";
42
+ if (eventName.startsWith("webhook:")) return "webhook";
43
+ if (eventName.startsWith("signature:")) return "signature";
44
+ if (eventName === "error" || eventName === "warning") return "error";
45
+ return "other";
46
+ }
47
+
48
+ async function main() {
49
+ console.log("šŸš€ Example 7: Event Listener\n");
50
+ console.log("This example listens to all SDK events and displays them in real-time.\n");
51
+
52
+ if (!PRIVATE_KEY) {
53
+ console.error("āŒ ERROR: PRIVATE_KEY environment variable is required\n");
54
+ process.exit(1);
55
+ }
56
+
57
+ // Build SDK
58
+ const config = new SDKConfigBuilder()
59
+ .withWebSocketUrl(WS_URL)
60
+ .withAuthentication(PRIVATE_KEY)
61
+ // .withAutoJoinRooms([DEFAULT_ROOM])
62
+ .withResponseFormat({ format: "both", includeMetadata: true })
63
+ .withLogging("info")
64
+ .build();
65
+
66
+ const sdk = new TeneoSDK(config);
67
+
68
+ // ============================================================================
69
+ // CONNECTION EVENTS
70
+ // ============================================================================
71
+
72
+ sdk.on("connection:open", () => {
73
+ eventStats.connection++;
74
+ console.log("šŸ”Œ [CONNECTION] WebSocket connection opened");
75
+ });
76
+
77
+ sdk.on("connection:close", (code, reason) => {
78
+ eventStats.connection++;
79
+ console.log(`šŸ”Œ [CONNECTION] Connection closed: ${code} - ${reason}`);
80
+ });
81
+
82
+ sdk.on("connection:error", (error) => {
83
+ eventStats.connection++;
84
+ console.error("šŸ”Œ [CONNECTION] Connection error:", error.message);
85
+ });
86
+
87
+ sdk.on("connection:reconnecting", (attempt) => {
88
+ eventStats.connection++;
89
+ console.log(`šŸ”Œ [CONNECTION] Reconnecting... (attempt ${attempt})`);
90
+ });
91
+
92
+ sdk.on("connection:reconnected", () => {
93
+ eventStats.connection++;
94
+ console.log("šŸ”Œ [CONNECTION] Reconnected successfully!");
95
+ });
96
+
97
+ sdk.on("connection:state", (state) => {
98
+ eventStats.connection++;
99
+ console.log("šŸ”Œ [CONNECTION] State changed:", {
100
+ connected: state.connected,
101
+ authenticated: state.authenticated,
102
+ reconnecting: state.reconnecting
103
+ });
104
+ });
105
+
106
+ // ============================================================================
107
+ // AUTHENTICATION EVENTS
108
+ // ============================================================================
109
+
110
+ sdk.on("auth:challenge", (challenge) => {
111
+ eventStats.auth++;
112
+ console.log(`šŸ” [AUTH] Challenge received: ${challenge.substring(0, 20)}...`);
113
+ });
114
+
115
+ sdk.on("auth:success", (state) => {
116
+ eventStats.auth++;
117
+ console.log("šŸ” [AUTH] āœ… Authentication successful!");
118
+ console.log(` Wallet: ${state.walletAddress}`);
119
+ console.log(` Whitelisted: ${state.isWhitelisted}`);
120
+ console.log(` Admin: ${state.isAdmin}`);
121
+ console.log(` NFT Verified: ${state.nftVerified}`);
122
+ console.log(` Rooms: ${state.rooms?.length || 0}`);
123
+ });
124
+
125
+ sdk.on("auth:error", (error) => {
126
+ eventStats.auth++;
127
+ console.error("šŸ” [AUTH] āŒ Authentication failed:", error);
128
+ });
129
+
130
+ sdk.on("auth:state", (state) => {
131
+ eventStats.auth++;
132
+ console.log("šŸ” [AUTH] State changed:", {
133
+ authenticated: state.authenticated,
134
+ wallet: state.walletAddress
135
+ });
136
+ });
137
+
138
+ // ============================================================================
139
+ // AGENT EVENTS
140
+ // ============================================================================
141
+
142
+ sdk.on("agent:selected", (data) => {
143
+ eventStats.agent++;
144
+ console.log("šŸ¤– [AGENT] Agent selected by coordinator:");
145
+ console.log(` Agent: ${data.agentName} (${data.agentId})`);
146
+ console.log(` Reasoning: ${data.reasoning}`);
147
+ if (data.command) {
148
+ console.log(` Command: ${data.command}`);
149
+ }
150
+ });
151
+
152
+ sdk.on("agent:response", (response) => {
153
+ eventStats.agent++;
154
+ console.log("šŸ¤– [AGENT] Response received:");
155
+ console.log(` Agent: ${response.agentName || response.agentId}`);
156
+ console.log(` Task ID: ${response.taskId}`);
157
+ console.log(` Success: ${response.success}`);
158
+ if (response.humanized) {
159
+ console.log(
160
+ ` Content: ${response.humanized.substring(0, 100)}${response.humanized.length > 100 ? "..." : ""}`
161
+ );
162
+ }
163
+ });
164
+
165
+ sdk.on("agent:list", (agents) => {
166
+ eventStats.agent++;
167
+ console.log(`šŸ¤– [AGENT] Agent list updated: ${agents.length} agents`);
168
+ });
169
+
170
+ // ============================================================================
171
+ // MESSAGE EVENTS
172
+ // ============================================================================
173
+
174
+ sdk.on("message:sent", (message) => {
175
+ eventStats.message++;
176
+ console.log("šŸ“¤ [MESSAGE] Message sent:");
177
+ console.log(` Type: ${message.type}`);
178
+ console.log(` Room: ${message.room || "N/A"}`);
179
+ });
180
+
181
+ sdk.on("message:received", (message) => {
182
+ eventStats.message++;
183
+ console.log("šŸ“„ [MESSAGE] Message received:");
184
+ console.log(` Type: ${message.type}`);
185
+ console.log(` From: ${message.from || "N/A"}`);
186
+ });
187
+
188
+ sdk.on("message:error", (error, message) => {
189
+ eventStats.message++;
190
+ console.error("šŸ“„ [MESSAGE] Message error:", error.message);
191
+ if (message) {
192
+ console.error(` Message type: ${message.type}`);
193
+ }
194
+ });
195
+
196
+ sdk.on("message:duplicate", (message) => {
197
+ eventStats.message++;
198
+ console.log("šŸ“„ [MESSAGE] Duplicate message detected and skipped:");
199
+ console.log(` ID: ${message.id}`);
200
+ console.log(` Type: ${message.type}`);
201
+ });
202
+
203
+ // ============================================================================
204
+ // ROOM EVENTS
205
+ // ============================================================================
206
+
207
+ sdk.on("room:subscribed", (data) => {
208
+ eventStats.room++;
209
+ console.log(`šŸ  [ROOM] Subscribed to room: ${data.roomId}`);
210
+ });
211
+
212
+ sdk.on("room:unsubscribed", (data) => {
213
+ eventStats.room++;
214
+ console.log(`šŸ  [ROOM] Unsubscribed from room: ${data.roomId}`);
215
+ });
216
+
217
+ sdk.on("room:list", (rooms) => {
218
+ eventStats.room++;
219
+ console.log(`šŸ  [ROOM] Room list received: ${rooms.length} rooms`);
220
+ });
221
+
222
+ // ============================================================================
223
+ // WEBHOOK EVENTS
224
+ // ============================================================================
225
+
226
+ sdk.on("webhook:sent", (payload, url) => {
227
+ eventStats.webhook++;
228
+ console.log("🌐 [WEBHOOK] Webhook sent:");
229
+ console.log(` URL: ${url}`);
230
+ console.log(` Event: ${payload.event}`);
231
+ });
232
+
233
+ sdk.on("webhook:success", (response, url) => {
234
+ eventStats.webhook++;
235
+ console.log(`🌐 [WEBHOOK] āœ… Delivery successful to ${url}`);
236
+ });
237
+
238
+ sdk.on("webhook:error", (error, url) => {
239
+ eventStats.webhook++;
240
+ console.error(`🌐 [WEBHOOK] āŒ Delivery failed to ${url}:`);
241
+ console.error(` Error: ${error.message}`);
242
+ });
243
+
244
+ sdk.on("webhook:retry", (attempt, url) => {
245
+ eventStats.webhook++;
246
+ console.log(`🌐 [WEBHOOK] šŸ”„ Retry attempt ${attempt} to ${url}`);
247
+ });
248
+
249
+ // ============================================================================
250
+ // SIGNATURE EVENTS (SEC-2)
251
+ // ============================================================================
252
+
253
+ sdk.on("signature:verified", (messageType, address) => {
254
+ eventStats.signature++;
255
+ console.log("šŸ” [SIGNATURE] āœ… Signature verified:");
256
+ console.log(` Message type: ${messageType}`);
257
+ console.log(` Address: ${address}`);
258
+ });
259
+
260
+ sdk.on("signature:failed", (messageType, reason, address) => {
261
+ eventStats.signature++;
262
+ console.error("šŸ” [SIGNATURE] āŒ Verification failed:");
263
+ console.error(` Message type: ${messageType}`);
264
+ console.error(` Reason: ${reason}`);
265
+ if (address) {
266
+ console.error(` Address: ${address}`);
267
+ }
268
+ });
269
+
270
+ sdk.on("signature:missing", (messageType, required) => {
271
+ eventStats.signature++;
272
+ console.log("šŸ” [SIGNATURE] āš ļø Signature missing:");
273
+ console.log(` Message type: ${messageType}`);
274
+ console.log(` Required: ${required}`);
275
+ });
276
+
277
+ // ============================================================================
278
+ // COORDINATOR EVENTS
279
+ // ============================================================================
280
+
281
+ sdk.on("coordinator:processing", (request) => {
282
+ eventStats.agent++;
283
+ console.log("šŸŽÆ [COORDINATOR] Processing request:", request);
284
+ });
285
+
286
+ sdk.on("coordinator:selected", (agentId, reasoning) => {
287
+ eventStats.agent++;
288
+ console.log("šŸŽÆ [COORDINATOR] Selected agent:");
289
+ console.log(` Agent ID: ${agentId}`);
290
+ console.log(` Reasoning: ${reasoning}`);
291
+ });
292
+
293
+ sdk.on("coordinator:error", (error) => {
294
+ eventStats.error++;
295
+ console.error("šŸŽÆ [COORDINATOR] Error:", error);
296
+ });
297
+
298
+ // ============================================================================
299
+ // LIFECYCLE EVENTS
300
+ // ============================================================================
301
+
302
+ sdk.on("ready", () => {
303
+ eventStats.other++;
304
+ console.log("āœ… [LIFECYCLE] SDK ready!");
305
+ });
306
+
307
+ sdk.on("disconnect", () => {
308
+ eventStats.other++;
309
+ console.log("šŸ‘‹ [LIFECYCLE] SDK disconnected");
310
+ });
311
+
312
+ sdk.on("destroy", () => {
313
+ eventStats.other++;
314
+ console.log("šŸ—‘ļø [LIFECYCLE] SDK destroyed");
315
+ });
316
+
317
+ // ============================================================================
318
+ // ERROR EVENTS
319
+ // ============================================================================
320
+
321
+ sdk.on("error", (error) => {
322
+ eventStats.error++;
323
+ console.error("āŒ [ERROR] SDK error:", error.message);
324
+ if (error.stack) {
325
+ console.error(" Stack:", error.stack.split("\n").slice(0, 3).join("\n"));
326
+ }
327
+ });
328
+
329
+ sdk.on("warning", (warning) => {
330
+ eventStats.error++;
331
+ console.warn("āš ļø [WARNING]", warning);
332
+ });
333
+
334
+ // ============================================================================
335
+ // CONNECT AND TRIGGER EVENTS
336
+ // ============================================================================
337
+
338
+ try {
339
+ console.log("šŸ“” Connecting to Teneo network...\n");
340
+ console.log("=".repeat(80));
341
+ console.log("Listening to all events... (will run for 30 seconds)");
342
+ console.log("=".repeat(80) + "\n");
343
+
344
+ await sdk.connect();
345
+
346
+ // Wait for agents
347
+ await new Promise((resolve) => setTimeout(resolve, 2000));
348
+
349
+ // Trigger some events for demonstration
350
+ console.log("\nšŸ”§ Triggering events for demonstration...\n");
351
+
352
+ // Get agents
353
+ const agents = sdk.getAgents();
354
+ console.log(`Found ${agents.length} agents\n`);
355
+
356
+ if (agents.length > 0) {
357
+ // Send a test message
358
+ const testAgent = agents.find((a) => a.status === "online") || agents[0];
359
+ console.log(`Sending test message to ${testAgent.name || testAgent.id}...\n`);
360
+
361
+ await sdk.sendDirectCommand(
362
+ {
363
+ agent: testAgent.id,
364
+ command: "hello event listener test",
365
+ room: DEFAULT_ROOM
366
+ },
367
+ false
368
+ );
369
+ }
370
+
371
+ // Keep listening for events
372
+ console.log("Listening to events for 30 seconds...\n");
373
+ await new Promise((resolve) => setTimeout(resolve, 30000));
374
+ } catch (error) {
375
+ console.error("\nāŒ Error:", error);
376
+ } finally {
377
+ // Display statistics
378
+ console.log("\n\n" + "=".repeat(80));
379
+ console.log("šŸ“Š EVENT STATISTICS");
380
+ console.log("=".repeat(80));
381
+ console.log(`Connection events: ${eventStats.connection}`);
382
+ console.log(`Authentication events: ${eventStats.auth}`);
383
+ console.log(`Message events: ${eventStats.message}`);
384
+ console.log(`Agent events: ${eventStats.agent}`);
385
+ console.log(`Room events: ${eventStats.room}`);
386
+ console.log(`Webhook events: ${eventStats.webhook}`);
387
+ console.log(`Signature events: ${eventStats.signature}`);
388
+ console.log(`Error/Warning events: ${eventStats.error}`);
389
+ console.log(`Other events: ${eventStats.other}`);
390
+ console.log("-".repeat(80));
391
+ const total = Object.values(eventStats).reduce((a, b) => a + b, 0);
392
+ console.log(`Total events: ${total}`);
393
+ console.log("=".repeat(80) + "\n");
394
+
395
+ sdk.disconnect();
396
+ sdk.destroy();
397
+ console.log("āœ… Disconnected");
398
+ console.log("šŸŽ‰ Example completed!");
399
+ }
400
+ }
401
+
402
+ main().catch(console.error);