@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,383 @@
1
+ # Teneo SDK Usage Examples
2
+
3
+ This directory contains progressive, hands-on examples demonstrating how to use the Teneo Consumer SDK. Each example builds on concepts from the previous ones, taking you from basic connection to building production-ready applications.
4
+
5
+ ## 📚 Examples Overview
6
+
7
+ | # | Example | Description | Key Concepts |
8
+ |---|---------|-------------|--------------|
9
+ | 1 | [Connect](#1-basic-connection) | Basic WebSocket connection | Config builder, authentication, lifecycle |
10
+ | 2 | [List Agents](#2-list-agents) | Retrieve available agents | Agent registry, properties, statistics |
11
+ | 3 | [Pick Agent](#3-pick-specific-agent) | Direct agent communication | sendDirectCommand, response handling |
12
+ | 4 | [Find by Capability](#4-find-by-capability) | Indexed agent search | O(1) lookups, capability matching |
13
+ | 5 | [Webhooks](#5-webhook-integration) | HTTP event notifications | Webhook setup, retry logic, circuit breaker |
14
+ | 6 | [API Server](#6-simple-api-server) | REST API wrapper | Express integration, endpoint design |
15
+ | 7 | [Event Listener](#7-event-listener) | Event-driven patterns | 30+ events, real-time monitoring |
16
+
17
+ ## 🚀 Prerequisites
18
+
19
+ Before running these examples, make sure you have:
20
+
21
+ 1. **Node.js 18+** installed
22
+ 2. **Built the SDK**: Run `npm run build` in the project root
23
+ 3. **Environment variables** set up (see below)
24
+
25
+ ## ⚙️ Environment Setup
26
+
27
+ Create a `.env` file in the project root or export these variables:
28
+
29
+ ```bash
30
+ # Required
31
+ PRIVATE_KEY=your_ethereum_private_key_here
32
+ WS_URL=wss://your-teneo-server.com/ws
33
+
34
+ # Optional
35
+ DEFAULT_ROOM=general
36
+ WALLET_ADDRESS=0x... # Auto-derived if not provided
37
+ LOG_LEVEL=info
38
+ ```
39
+
40
+ ## 📖 Usage Examples
41
+
42
+ ### 1. Basic Connection
43
+
44
+ **File**: `01-connect.ts`
45
+
46
+ The simplest example - connect to Teneo and authenticate.
47
+
48
+ ```bash
49
+ npx tsx examples/usage/01-connect.ts
50
+ ```
51
+
52
+ **What you'll learn**:
53
+ - Using `SDKConfigBuilder` for configuration
54
+ - Connecting to the WebSocket server
55
+ - Ethereum wallet authentication
56
+ - Event listeners for connection lifecycle
57
+ - Graceful disconnection and cleanup
58
+
59
+ **Output**:
60
+ ```
61
+ 🚀 Example 1: Basic SDK Connection
62
+ ⚙️ Step 1: Building SDK configuration...
63
+ ✅ Configuration built
64
+ ...
65
+ ✅ Connected and authenticated!
66
+ ```
67
+
68
+ ---
69
+
70
+ ### 2. List Agents
71
+
72
+ **File**: `02-list-agents.ts`
73
+
74
+ Retrieve and inspect all available agents in the network.
75
+
76
+ ```bash
77
+ npx tsx examples/usage/02-list-agents.ts
78
+ ```
79
+
80
+ **What you'll learn**:
81
+ - Getting the agent list
82
+ - Inspecting agent properties (name, description, status)
83
+ - Viewing agent capabilities and commands
84
+ - Getting statistics (online/offline counts)
85
+
86
+ **Output**:
87
+ ```
88
+ 📊 Agent Details:
89
+ 1. X Platform Agent
90
+ ID: x-agent-001
91
+ Status: online
92
+ Capabilities: social-media, twitter
93
+ ...
94
+ ```
95
+
96
+ ---
97
+
98
+ ### 3. Pick Specific Agent
99
+
100
+ **File**: `03-pick-agent.ts`
101
+
102
+ Find and communicate with a specific agent.
103
+
104
+ ```bash
105
+ # Pick by name
106
+ npx tsx examples/usage/03-pick-agent.ts "X Platform Agent"
107
+
108
+ # Or let it auto-select
109
+ npx tsx examples/usage/03-pick-agent.ts
110
+ ```
111
+
112
+ **What you'll learn**:
113
+ - Finding agents by ID or name
114
+ - Sending direct commands to agents
115
+ - Waiting for responses with timeout
116
+ - Handling both humanized and raw responses
117
+ - Response metadata (task ID, duration, etc.)
118
+
119
+ **Output**:
120
+ ```
121
+ ✅ Selected: X Platform Agent
122
+ ⚙️ Sending command to agent...
123
+ Command: timeline @elonmusk 3
124
+ Waiting for response...
125
+ ✅ Response received!
126
+ 📝 Humanized Response: [response content]
127
+ ```
128
+
129
+ ---
130
+
131
+ ### 4. Find by Capability
132
+
133
+ **File**: `04-find-by-capability.ts`
134
+
135
+ Use the SDK's indexed search for efficient agent discovery.
136
+
137
+ ```bash
138
+ npx tsx examples/usage/04-find-by-capability.ts
139
+ ```
140
+
141
+ **What you'll learn**:
142
+ - **PERF-3**: O(1) capability lookups
143
+ - O(1) status lookups (online/offline)
144
+ - O(k) name-based token search
145
+ - Performance comparison
146
+ - Practical agent selection strategies
147
+
148
+ **Output**:
149
+ ```
150
+ 🔍 Searching for capability: "weather-forecast"
151
+ ✅ Found 2 agent(s) (0.123ms):
152
+ • Weather Agent
153
+ • Climate Data Agent
154
+
155
+ 📊 Performance Summary:
156
+ • Capability search: O(1) - constant time
157
+ • Status search: O(1) - constant time
158
+ ```
159
+
160
+ ---
161
+
162
+ ### 5. Webhook Integration
163
+
164
+ **File**: `05-webhook-example.ts`
165
+
166
+ Set up HTTP webhooks to receive SDK events.
167
+
168
+ ```bash
169
+ npx tsx examples/usage/05-webhook-example.ts
170
+ ```
171
+
172
+ **What you'll learn**:
173
+ - Creating a local webhook receiver
174
+ - Configuring SDK webhook delivery
175
+ - Receiving webhook events
176
+ - Automatic retry with exponential backoff
177
+ - Circuit breaker pattern
178
+ - Queue management
179
+
180
+ **Output**:
181
+ ```
182
+ ✅ Webhook server running on http://localhost:3001
183
+ 🎯 Webhook received!
184
+ Event: agent:response
185
+ Timestamp: 2025-10-28T...
186
+ ```
187
+
188
+ ---
189
+
190
+ ### 6. Simple API Server
191
+
192
+ **File**: `06-simple-api-server.ts`
193
+
194
+ Build a REST API that wraps the Teneo SDK.
195
+
196
+ ```bash
197
+ npx tsx examples/usage/06-simple-api-server.ts
198
+ ```
199
+
200
+ Then test with curl:
201
+
202
+ ```bash
203
+ # Health check
204
+ curl http://localhost:3000/health
205
+
206
+ # List agents
207
+ curl http://localhost:3000/agents
208
+
209
+ # Send message
210
+ curl -X POST http://localhost:3000/message \
211
+ -H "Content-Type: application/json" \
212
+ -d '{"message":"hello","waitForResponse":true}'
213
+
214
+ # Find by capability
215
+ curl http://localhost:3000/agents/capability/weather-forecast
216
+ ```
217
+
218
+ **What you'll learn**:
219
+ - Building Express REST API
220
+ - Wrapping SDK in HTTP endpoints
221
+ - Error handling patterns
222
+ - Health monitoring
223
+ - Production-ready server design
224
+
225
+ **Endpoints**:
226
+ - `GET /health` - Server and SDK health
227
+ - `GET /agents` - List all agents
228
+ - `GET /agents/:id` - Get specific agent
229
+ - `GET /agents/capability/:capability` - Find by capability
230
+ - `POST /message` - Send message to agent
231
+ - `GET /rooms` - List rooms
232
+ - `POST /rooms/:roomId/subscribe` - Subscribe to room
233
+
234
+ ---
235
+
236
+ ### 7. Event Listener
237
+
238
+ **File**: `07-event-listener.ts`
239
+
240
+ Listen to all SDK events for real-time monitoring.
241
+
242
+ ```bash
243
+ npx tsx examples/usage/07-event-listener.ts
244
+ ```
245
+
246
+ **What you'll learn**:
247
+ - All 30+ SDK event types
248
+ - Event categorization (connection, auth, agent, message, etc.)
249
+ - Real-time event monitoring
250
+ - Event-driven architecture
251
+ - Statistics and analytics
252
+
253
+ **Output**:
254
+ ```
255
+ 🔌 [CONNECTION] WebSocket connection opened
256
+ 🔐 [AUTH] ✅ Authentication successful!
257
+ 🤖 [AGENT] Agent list updated: 5 agents
258
+ 📤 [MESSAGE] Message sent: Type: message
259
+ ...
260
+ 📊 EVENT STATISTICS
261
+ Connection events: 12
262
+ Authentication events: 4
263
+ Agent events: 8
264
+ ```
265
+
266
+ ---
267
+
268
+ ## 🎯 Learning Path
269
+
270
+ We recommend following this learning path:
271
+
272
+ 1. **Start with 01-connect.ts** to understand basic setup
273
+ 2. **Try 02-list-agents.ts** to explore the agent registry
274
+ 3. **Run 03-pick-agent.ts** to learn agent communication
275
+ 4. **Explore 04-find-by-capability.ts** for efficient search
276
+ 5. **Set up 05-webhook-example.ts** for event notifications
277
+ 6. **Build 06-simple-api-server.ts** for production patterns
278
+ 7. **Monitor with 07-event-listener.ts** for observability
279
+
280
+ ## 🔧 Common Patterns
281
+
282
+ ### Pattern 1: Basic Message Flow
283
+
284
+ ```typescript
285
+ const sdk = new TeneoSDK(config);
286
+ await sdk.connect();
287
+
288
+ // Send and wait for response
289
+ const response = await sdk.sendMessage('hello', {
290
+ room: 'general',
291
+ waitForResponse: true,
292
+ timeout: 30000
293
+ });
294
+
295
+ console.log(response.humanized);
296
+ ```
297
+
298
+ ### Pattern 2: Direct Agent Command
299
+
300
+ ```typescript
301
+ // Find agent by capability
302
+ const agents = sdk.findAgentsByCapability('weather');
303
+ const weatherAgent = agents[0];
304
+
305
+ // Send direct command
306
+ const response = await sdk.sendDirectCommand({
307
+ agent: weatherAgent.id,
308
+ command: 'forecast for NYC',
309
+ room: 'general'
310
+ }, true);
311
+ ```
312
+
313
+ ### Pattern 3: Event-Driven
314
+
315
+ ```typescript
316
+ sdk.on('agent:response', (response) => {
317
+ console.log('Response:', response.humanized);
318
+ // Process response asynchronously
319
+ });
320
+
321
+ // Fire and forget
322
+ await sdk.sendMessage('hello', { room: 'general' });
323
+ ```
324
+
325
+ ## 🐛 Troubleshooting
326
+
327
+ ### "PRIVATE_KEY is required"
328
+
329
+ Set the environment variable:
330
+ ```bash
331
+ export PRIVATE_KEY=your_private_key_here
332
+ ```
333
+
334
+ ### "No agents available"
335
+
336
+ Wait a bit longer after connecting:
337
+ ```typescript
338
+ await sdk.connect();
339
+ await new Promise(resolve => setTimeout(resolve, 2000)); // Wait 2s
340
+ ```
341
+
342
+ ### "Webhook delivery failed"
343
+
344
+ Ensure your webhook URL is accessible:
345
+ - Use `http://localhost:PORT` for local testing
346
+ - Use HTTPS for production webhooks
347
+ - Check firewall settings
348
+
349
+ ### "Connection timeout"
350
+
351
+ Check your WebSocket URL and network:
352
+ ```typescript
353
+ const config = new SDKConfigBuilder()
354
+ .withWebSocketUrl('wss://correct-url.com/ws')
355
+ .withReconnection({ enabled: true, maxAttempts: 10 })
356
+ .build();
357
+ ```
358
+
359
+ ## 📚 Next Steps
360
+
361
+ After completing these examples, check out:
362
+
363
+ - **[Integration Examples](../INTEGRATION_EXAMPLES.md)** - Claude, OpenAI, n8n integrations
364
+ - **[Production Dashboard](../production-dashboard/)** - Full-featured monitoring UI
365
+ - **[API Documentation](../../docs/)** - Complete API reference
366
+ - **[Main README](../../README.md)** - Full SDK documentation
367
+
368
+ ## 💡 Tips
369
+
370
+ 1. **Always build the SDK first**: Run `npm run build` before running examples
371
+ 2. **Use environment variables**: Don't hardcode credentials
372
+ 3. **Enable debug logging**: Set `LOG_LEVEL=debug` for troubleshooting
373
+ 4. **Check health status**: Use `sdk.getHealth()` to monitor SDK state
374
+ 5. **Handle errors**: Always use try-catch blocks in production code
375
+
376
+ ## 🤝 Contributing
377
+
378
+ Found an issue or want to add an example? Please open an issue or PR!
379
+
380
+ ## 📄 License
381
+
382
+ MIT - See [LICENSE](../../LICENSE) for details
383
+
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@teneo/usage-examples",
3
+ "version": "1.0.0",
4
+ "description": "Step-by-step usage examples for Teneo Protocol SDK",
5
+ "private": true,
6
+ "type": "module",
7
+ "scripts": {
8
+ "01:connect": "tsx 01-connect.ts",
9
+ "02:list-agents": "tsx 02-list-agents.ts",
10
+ "03:pick-agent": "tsx 03-pick-agent.ts",
11
+ "04:find-by-capability": "tsx 04-find-by-capability.ts",
12
+ "05:webhook": "tsx 05-webhook-example.ts",
13
+ "06:api-server": "tsx 06-simple-api-server.ts",
14
+ "07:event-listener": "tsx 07-event-listener.ts",
15
+ "all": "npm run 01:connect && npm run 02:list-agents && npm run 03:pick-agent && npm run 04:find-by-capability"
16
+ },
17
+ "dependencies": {
18
+ "dotenv": "^16.4.0",
19
+ "express": "^4.18.2"
20
+ },
21
+ "devDependencies": {
22
+ "@types/express": "^4.17.21",
23
+ "@types/node": "^20.10.5",
24
+ "tsx": "^4.7.0",
25
+ "typescript": "^5.3.3"
26
+ },
27
+ "engines": {
28
+ "node": ">=18.0.0"
29
+ },
30
+ "keywords": [
31
+ "teneo",
32
+ "sdk",
33
+ "examples",
34
+ "usage",
35
+ "tutorial",
36
+ "websocket",
37
+ "ai",
38
+ "agents"
39
+ ],
40
+ "author": "Teneo Protocol",
41
+ "license": "MIT"
42
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teneo-protocol/sdk",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
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",
@@ -15,9 +15,16 @@
15
15
  ],
16
16
  "author": "Teneo Protocol",
17
17
  "license": "AGPL-3.0",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/TeneoProtocolAI/teneo-sdk.git"
21
+ },
22
+ "bugs": {
23
+ "url": "https://github.com/TeneoProtocolAI/teneo-sdk/issues"
24
+ },
25
+ "homepage": "https://github.com/TeneoProtocolAI/teneo-sdk#readme",
18
26
  "dependencies": {
19
27
  "eventemitter3": "^5.0.1",
20
- "hono": "^4.9.12",
21
28
  "node-fetch": "^3.3.2",
22
29
  "pino": "^8.17.2",
23
30
  "uuid": "^9.0.1",
@@ -60,6 +67,9 @@
60
67
  "lint:fix": "eslint . --ext .ts --fix",
61
68
  "format": "prettier --write \"src/**/*.ts\"",
62
69
  "example:battle": "ts-node examples/x-influencer-battle-server.ts",
63
- "example:dashboard": "cd examples/production-dashboard && bun run server.ts"
70
+ "example:dashboard": "cd examples/production-dashboard && bun run server.ts",
71
+ "example:claude": "tsx examples/claude-agent-x-follower/index.ts",
72
+ "example:openai": "cd examples/openai-teneo && tsx index.ts",
73
+ "example:n8n": "cd examples/n8n-teneo && tsx index.ts"
64
74
  }
65
75
  }
@@ -56,6 +56,9 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
56
56
  private deduplicationCache?: DeduplicationCache;
57
57
  private reconnectPolicy: RetryPolicy;
58
58
  private roomManager?: any; // Reference to RoomManager for handler context
59
+ private roomManagementManager?: any; // Reference to RoomManagementManager for handler context (v2.0.0)
60
+ private agentRoomManager?: any; // Reference to AgentRoomManager for handler context (v2.0.0)
61
+ private intentionalDisconnect: boolean = false; // Track intentional disconnect to prevent reconnection
59
62
 
60
63
  private connectionState: ConnectionState = {
61
64
  connected: false,
@@ -94,15 +97,13 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
94
97
  if (config.privateKey) {
95
98
  try {
96
99
  // Check if privateKey is already a SecurePrivateKey instance (SEC-3)
97
- if (typeof config.privateKey === 'object' && 'use' in config.privateKey) {
100
+ if (typeof config.privateKey === "object" && "use" in config.privateKey) {
98
101
  // Use the provided SecurePrivateKey directly
99
102
  this.secureKey = config.privateKey;
100
103
  this.ownsSecureKey = false; // User provided it, we don't own it
101
104
 
102
105
  // Create account using the secure key
103
- this.account = this.secureKey.use((key) =>
104
- privateKeyToAccount(key as `0x${string}`)
105
- );
106
+ this.account = this.secureKey.use((key) => privateKeyToAccount(key as `0x${string}`));
106
107
  } else {
107
108
  // privateKey is a plain string - encrypt it immediately
108
109
  const privateKeyString = config.privateKey as string;
@@ -117,9 +118,7 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
117
118
  this.ownsSecureKey = true; // We created it, we own it
118
119
 
119
120
  // Create account using the secure key
120
- this.account = this.secureKey.use((key) =>
121
- privateKeyToAccount(key as `0x${string}`)
122
- );
121
+ this.account = this.secureKey.use((key) => privateKeyToAccount(key as `0x${string}`));
123
122
  }
124
123
 
125
124
  if (
@@ -214,6 +213,22 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
214
213
  this.roomManager = roomManager;
215
214
  }
216
215
 
216
+ /**
217
+ * Sets the room management manager for room CRUD operations (v2.0.0)
218
+ * @internal
219
+ */
220
+ public setRoomManagementManager(roomManagementManager: any): void {
221
+ this.roomManagementManager = roomManagementManager;
222
+ }
223
+
224
+ /**
225
+ * Sets the agent room manager for agent-room operations (v2.0.0)
226
+ * @internal
227
+ */
228
+ public setAgentRoomManager(agentRoomManager: any): void {
229
+ this.agentRoomManager = agentRoomManager;
230
+ }
231
+
217
232
  /**
218
233
  * Establishes a WebSocket connection to the Teneo server.
219
234
  * Handles connection timeout, authentication challenge-response flow,
@@ -241,6 +256,10 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
241
256
  // Clear any existing connection
242
257
  this.disconnect();
243
258
 
259
+ // Reset intentional disconnect flag after clearing connection
260
+ // This allows automatic reconnection for this new connection
261
+ this.intentionalDisconnect = false;
262
+
244
263
  // Build connection URL with webhook parameter
245
264
  let url = this.config.wsUrl;
246
265
  if (this.config.webhookUrl) {
@@ -295,7 +314,11 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
295
314
  if (parseResult.success) {
296
315
  this.handleMessage(parseResult.data as BaseMessage);
297
316
  } else {
298
- this.logger.error("Invalid message format", parseResult.error);
317
+ // Use warn instead of error - allows SDK to be more resilient
318
+ this.logger.warn("Received message with unknown or invalid format", {
319
+ type: rawMessage?.type,
320
+ error: parseResult.error?.message
321
+ });
299
322
  this.emit(
300
323
  "message:error",
301
324
  new ValidationError("Invalid message format", parseResult.error),
@@ -362,6 +385,9 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
362
385
  public disconnect(): void {
363
386
  this.logger.info("Disconnecting from WebSocket server");
364
387
 
388
+ // Mark as intentional disconnect to prevent reconnection
389
+ this.intentionalDisconnect = true;
390
+
365
391
  // Clear all timers
366
392
  if (this.reconnectTimer) {
367
393
  clearTimeout(this.reconnectTimer);
@@ -490,7 +516,7 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
490
516
  this.logger.error("Failed to send message", error);
491
517
  reject(error);
492
518
  } else {
493
- this.logger.debug("Message sent", { type: validatedMessage.type });
519
+ this.logger.debug("Message sent", validatedMessage);
494
520
  this.emit("message:sent", validatedMessage);
495
521
  resolve();
496
522
  }
@@ -649,6 +675,8 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
649
675
  updateConnectionState: (update: any) => this.updateConnectionState(update),
650
676
  updateAuthState: (update: any) => this.updateAuthState(update),
651
677
  roomManager: this.roomManager,
678
+ roomManagementManager: this.roomManagementManager,
679
+ agentRoomManager: this.agentRoomManager,
652
680
  account: this.account,
653
681
  sendMessage: (message: BaseMessage) => this.sendMessage(message)
654
682
  };
@@ -795,6 +823,12 @@ export class WebSocketClient extends EventEmitter<SDKEvents> {
795
823
  * Handle reconnection logic with configurable retry strategy (REL-3)
796
824
  */
797
825
  private handleReconnection(): void {
826
+ // Don't reconnect if disconnect was intentional
827
+ if (this.intentionalDisconnect) {
828
+ this.logger.debug("Skipping reconnection - disconnect was intentional");
829
+ return;
830
+ }
831
+
798
832
  if (!this.config.reconnect || this.connectionState.reconnecting) {
799
833
  return;
800
834
  }
@@ -428,12 +428,18 @@ describe("ResponseFormatter", () => {
428
428
  data: { message: "Test", code: 1 }
429
429
  };
430
430
 
431
- const rawResult = ResponseFormatter.validateAndFormat(message, { format: "raw", includeMetadata: false });
431
+ const rawResult = ResponseFormatter.validateAndFormat(message, {
432
+ format: "raw",
433
+ includeMetadata: false
434
+ });
432
435
  expect(rawResult.raw).toBeDefined();
433
436
  expect(rawResult.humanized).toBeUndefined();
434
437
  expect(rawResult.metadata).toBeUndefined();
435
438
 
436
- const bothWithMeta = ResponseFormatter.validateAndFormat(message, { format: "both", includeMetadata: true });
439
+ const bothWithMeta = ResponseFormatter.validateAndFormat(message, {
440
+ format: "both",
441
+ includeMetadata: true
442
+ });
437
443
  expect(bothWithMeta.raw).toBeDefined();
438
444
  expect(bothWithMeta.humanized).toBeDefined();
439
445
  expect(bothWithMeta.metadata).toBeDefined();
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Handler for agent_room_operation_response messages (v2.0.0)
3
+ * Processes responses from agent-room operations (add, remove)
4
+ */
5
+
6
+ import {
7
+ AgentRoomOperationResponse,
8
+ AgentRoomOperationResponseSchema
9
+ } from "../../types";
10
+ import { BaseMessageHandler } from "./base-handler";
11
+ import { HandlerContext } from "./types";
12
+ import { SDKError } from "../../types/events";
13
+ import { ErrorCode } from "../../types/error-codes";
14
+
15
+ export class AgentRoomOperationResponseHandler extends BaseMessageHandler<AgentRoomOperationResponse> {
16
+ readonly type = "agent_room_operation_response" as const;
17
+ readonly schema = AgentRoomOperationResponseSchema;
18
+
19
+ protected handleValidated(
20
+ message: AgentRoomOperationResponse,
21
+ context: HandlerContext
22
+ ): void {
23
+ const { success, message: errorMessage, room_id, agent_id } = message.data;
24
+
25
+ context.logger.debug("Handling agent_room_operation_response", {
26
+ success,
27
+ roomId: room_id,
28
+ agentId: agent_id
29
+ });
30
+
31
+ if (!success) {
32
+ // Operation failed - emit error events
33
+ const error = new SDKError(
34
+ errorMessage || "Agent room operation failed",
35
+ ErrorCode.OPERATION_FAILED
36
+ );
37
+
38
+ context.logger.error("Agent room operation failed", {
39
+ roomId: room_id,
40
+ agentId: agent_id,
41
+ error: errorMessage
42
+ });
43
+
44
+ // Emit both add and remove error events - listeners will filter by room/agent ID
45
+ this.emit(context, "agent_room:add_error", error, room_id);
46
+ this.emit(context, "agent_room:remove_error", error, room_id);
47
+
48
+ // Send webhook
49
+ this.sendWebhook(context, "agent_room_operation_error", {
50
+ success: false,
51
+ message: errorMessage,
52
+ room_id,
53
+ agent_id
54
+ });
55
+
56
+ return;
57
+ }
58
+
59
+ // Operation succeeded
60
+ if (room_id && agent_id) {
61
+ context.logger.info("Agent room operation succeeded", {
62
+ roomId: room_id,
63
+ agentId: agent_id
64
+ });
65
+
66
+ // Emit success events
67
+ // The promise handlers in AgentRoomManager will filter by room_id and agent_id
68
+ this.emit(context, "agent_room:agent_added", room_id, agent_id);
69
+ this.emit(context, "agent_room:agent_removed", room_id, agent_id);
70
+
71
+ // Send webhook
72
+ this.sendWebhook(context, "agent_room_operation", {
73
+ success: true,
74
+ room_id,
75
+ agent_id,
76
+ message: "Agent room operation completed successfully"
77
+ });
78
+ } else {
79
+ // Unexpected: success but missing required fields
80
+ context.logger.warn("Agent room operation succeeded but missing room_id or agent_id");
81
+ }
82
+ }
83
+ }