@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,334 @@
1
+ /**
2
+ * Agent Room Management Example
3
+ *
4
+ * Demonstrates how to customize which agents are available in each room using Teneo SDK v2.0.
5
+ *
6
+ * This example shows:
7
+ * - Listing available agents for a room
8
+ * - Adding specific agents to your room
9
+ * - Listing agents currently in a room
10
+ * - Removing agents from a room
11
+ * - Using cache for performance
12
+ * - Real-time agent status updates
13
+ *
14
+ * Prerequisites:
15
+ * - Set TENEO_WS_URL environment variable
16
+ * - Set PRIVATE_KEY environment variable (64 hex characters, no 0x prefix)
17
+ * - Have at least one owned room
18
+ *
19
+ * Run:
20
+ * npx ts-node examples/agent-room-management-example.ts
21
+ */
22
+
23
+ import { TeneoSDK } from "../src";
24
+ import * as dotenv from "dotenv";
25
+
26
+ dotenv.config();
27
+
28
+ const wsUrl = process.env.TENEO_WS_URL!;
29
+ const privateKey = process.env.PRIVATE_KEY!;
30
+
31
+ async function main() {
32
+ console.log("🚀 Teneo SDK v2.0 - Agent Room Management Example\n");
33
+
34
+ // Initialize SDK
35
+ const sdk = new TeneoSDK({
36
+ wsUrl,
37
+ privateKey,
38
+ logLevel: "info",
39
+ reconnect: true
40
+ });
41
+
42
+ // Set up event listeners
43
+ setupEventListeners(sdk);
44
+
45
+ try {
46
+ // Connect and authenticate
47
+ console.log("📡 Connecting to Teneo network...");
48
+ await sdk.connect();
49
+ console.log("✅ Connected and authenticated\n");
50
+
51
+ // Wait for initial data to load
52
+ await new Promise(resolve => setTimeout(resolve, 1000));
53
+
54
+ // Step 1: Get or create a test room
55
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
56
+ console.log("🏠 Setting Up Test Room");
57
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
58
+ const testRoom = await getOrCreateTestRoom(sdk);
59
+
60
+ if (!testRoom) {
61
+ console.log("❌ Could not get or create a test room");
62
+ return;
63
+ }
64
+
65
+ console.log(`Using room: "${testRoom.name}" (${testRoom.id})\n`);
66
+
67
+ // Step 2: List current agents in the room
68
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
69
+ console.log("📋 Current Agents in Room");
70
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
71
+ const currentAgents = await sdk.listRoomAgents(testRoom.id, false); // Force fresh data
72
+ displayAgents(currentAgents, "room");
73
+
74
+ // Step 3: List available agents (not yet in room)
75
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
76
+ console.log("🆕 Available Agents (Not in Room)");
77
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
78
+ const availableAgents = await sdk.listAvailableAgents(testRoom.id, false);
79
+ displayAgents(availableAgents, "available");
80
+
81
+ // Step 4: Add agents to the room
82
+ if (availableAgents.length > 0) {
83
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
84
+ console.log("➕ Adding Agents to Room");
85
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
86
+ await addAgentsToRoom(sdk, testRoom.id, availableAgents);
87
+
88
+ // Wait for additions to process
89
+ await new Promise(resolve => setTimeout(resolve, 500));
90
+ }
91
+
92
+ // Step 5: List updated room agents (using cache this time)
93
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
94
+ console.log("📋 Updated Room Agents (from cache)");
95
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
96
+ const updatedAgents = await sdk.listRoomAgents(testRoom.id, true); // Use cache
97
+ displayAgents(updatedAgents, "room");
98
+
99
+ // Step 6: Demonstrate synchronous query methods
100
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
101
+ console.log("⚡ Instant Cache Queries (No Network Call)");
102
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
103
+ demonstrateCacheQueries(sdk, testRoom.id, updatedAgents);
104
+
105
+ // Step 7: Remove agents from the room
106
+ if (updatedAgents.length > 0) {
107
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
108
+ console.log("➖ Removing Agents from Room");
109
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
110
+ await removeAgentsFromRoom(sdk, testRoom.id, updatedAgents);
111
+
112
+ // Wait for removals to process
113
+ await new Promise(resolve => setTimeout(resolve, 500));
114
+ }
115
+
116
+ // Step 8: Final room status
117
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
118
+ console.log("📊 Final Room Status");
119
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
120
+ const finalAgents = await sdk.listRoomAgents(testRoom.id, false);
121
+ displayAgents(finalAgents, "room");
122
+
123
+ // Step 9: Demonstrate cache invalidation
124
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
125
+ console.log("🔄 Cache Management");
126
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
127
+ console.log("Cache is automatically invalidated when:");
128
+ console.log(" ✓ You add an agent to the room");
129
+ console.log(" ✓ You remove an agent from the room");
130
+ console.log(" ✓ An agent's status changes");
131
+ console.log(" ✓ Cache TTL expires (5 minutes)");
132
+ console.log("\nManual cache invalidation:");
133
+ sdk.invalidateAgentRoomCache(testRoom.id);
134
+ console.log(` ✅ Cache cleared for room ${testRoom.id}`);
135
+
136
+ console.log("\n✅ Agent room management example completed!");
137
+
138
+ } catch (error: any) {
139
+ console.error("\n❌ Error:", error.message);
140
+ console.error(error.stack);
141
+ } finally {
142
+ // Disconnect
143
+ console.log("\n👋 Disconnecting...");
144
+ sdk.disconnect();
145
+ console.log("✅ Disconnected");
146
+ }
147
+ }
148
+
149
+ function setupEventListeners(sdk: TeneoSDK) {
150
+ // Agent added
151
+ sdk.on("agent_room:agent_added", (roomId, agentId) => {
152
+ console.log(` ✅ Agent ${agentId} added to room ${roomId}`);
153
+ });
154
+
155
+ // Agent removed
156
+ sdk.on("agent_room:agent_removed", (roomId, agentId) => {
157
+ console.log(` ✅ Agent ${agentId} removed from room ${roomId}`);
158
+ });
159
+
160
+ // Agents listed
161
+ sdk.on("agent_room:agents_listed", (roomId, agents) => {
162
+ console.log(` 📋 Listed ${agents.length} agents in room ${roomId}`);
163
+ });
164
+
165
+ // Available agents listed
166
+ sdk.on("agent_room:available_agents_listed", (agents) => {
167
+ console.log(` 📋 Listed ${agents.length} available agents`);
168
+ });
169
+
170
+ // Status updates (real-time)
171
+ sdk.on("agent_room:status_update", (data) => {
172
+ console.log(` 🔄 Agent ${data.agentId} status updated in room ${data.roomId}`);
173
+ console.log(` New status: ${data.status}`);
174
+ });
175
+
176
+ // Error events
177
+ sdk.on("agent_room:add_error", (error, roomId) => {
178
+ console.error(` ❌ Failed to add agent to room ${roomId}: ${error.message}`);
179
+ });
180
+
181
+ sdk.on("agent_room:remove_error", (error, roomId) => {
182
+ console.error(` ❌ Failed to remove agent from room ${roomId}: ${error.message}`);
183
+ });
184
+
185
+ sdk.on("agent_room:list_error", (error, roomId) => {
186
+ console.error(` ❌ Failed to list agents in room ${roomId}: ${error.message}`);
187
+ });
188
+ }
189
+
190
+ async function getOrCreateTestRoom(sdk: TeneoSDK) {
191
+ // Try to get an existing owned room
192
+ const ownedRooms = sdk.getOwnedRooms();
193
+
194
+ if (ownedRooms.length > 0) {
195
+ console.log(`Found ${ownedRooms.length} existing owned room(s)`);
196
+ console.log(`Using first room: "${ownedRooms[0].name}"`);
197
+ return ownedRooms[0];
198
+ }
199
+
200
+ // Create a new test room
201
+ console.log("No owned rooms found. Creating test room...");
202
+
203
+ if (!sdk.canCreateRoom()) {
204
+ console.log("⚠️ Cannot create room - limit reached");
205
+ console.log(` Current: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
206
+ return null;
207
+ }
208
+
209
+ try {
210
+ const room = await sdk.createRoom({
211
+ name: "Agent Test Room",
212
+ description: "Room for testing agent customization (SDK v2.0 example)"
213
+ });
214
+ console.log(`✅ Created test room: ${room.id}`);
215
+ return room;
216
+ } catch (error: any) {
217
+ console.error(`Failed to create test room: ${error.message}`);
218
+ return null;
219
+ }
220
+ }
221
+
222
+ function displayAgents(agents: any[], type: "room" | "available") {
223
+ if (agents.length === 0) {
224
+ console.log(` (No ${type === "room" ? "agents in room" : "available agents"})`);
225
+ return;
226
+ }
227
+
228
+ console.log(`Found ${agents.length} agent(s):\n`);
229
+
230
+ agents.forEach((agent, i) => {
231
+ console.log(`${i + 1}. ${agent.agent_name || "Unnamed Agent"}`);
232
+ console.log(` ID: ${agent.agent_id}`);
233
+
234
+ if (agent.description) {
235
+ console.log(` Description: ${agent.description}`);
236
+ }
237
+
238
+ if (agent.status) {
239
+ console.log(` Status: ${agent.status}`);
240
+ }
241
+
242
+ if (agent.capabilities && agent.capabilities.length > 0) {
243
+ const capNames = agent.capabilities.map((c: any) => c.name).join(", ");
244
+ console.log(` Capabilities: ${capNames}`);
245
+ }
246
+
247
+ if (agent.commands && agent.commands.length > 0) {
248
+ const cmdTriggers = agent.commands.map((c: any) => `/${c.trigger}`).join(", ");
249
+ console.log(` Commands: ${cmdTriggers}`);
250
+ }
251
+
252
+ if (agent.image) {
253
+ console.log(` Image: ${agent.image.substring(0, 50)}...`);
254
+ }
255
+
256
+ if (agent.added_at) {
257
+ console.log(` Added at: ${agent.added_at}`);
258
+ }
259
+
260
+ if (agent.added_by) {
261
+ console.log(` Added by: ${agent.added_by}`);
262
+ }
263
+
264
+ console.log();
265
+ });
266
+ }
267
+
268
+ async function addAgentsToRoom(sdk: TeneoSDK, roomId: string, availableAgents: any[]) {
269
+ // Add up to 2 agents from the available list
270
+ const agentsToAdd = availableAgents.slice(0, 2);
271
+
272
+ console.log(`Adding ${agentsToAdd.length} agent(s) to the room...\n`);
273
+
274
+ for (const agent of agentsToAdd) {
275
+ try {
276
+ console.log(`Adding "${agent.agent_name}" (${agent.agent_id})...`);
277
+ await sdk.addAgentToRoom(roomId, agent.agent_id);
278
+ // Wait a bit between additions
279
+ await new Promise(resolve => setTimeout(resolve, 300));
280
+ } catch (error: any) {
281
+ console.error(`Failed to add agent ${agent.agent_id}: ${error.message}`);
282
+ }
283
+ }
284
+ }
285
+
286
+ async function removeAgentsFromRoom(sdk: TeneoSDK, roomId: string, roomAgents: any[]) {
287
+ // Remove up to 2 agents
288
+ const agentsToRemove = roomAgents.slice(0, 2);
289
+
290
+ console.log(`Removing ${agentsToRemove.length} agent(s) from the room...\n`);
291
+
292
+ for (const agent of agentsToRemove) {
293
+ try {
294
+ console.log(`Removing "${agent.agent_name}" (${agent.agent_id})...`);
295
+ await sdk.removeAgentFromRoom(roomId, agent.agent_id);
296
+ // Wait a bit between removals
297
+ await new Promise(resolve => setTimeout(resolve, 300));
298
+ } catch (error: any) {
299
+ console.error(`Failed to remove agent ${agent.agent_id}: ${error.message}`);
300
+ }
301
+ }
302
+ }
303
+
304
+ function demonstrateCacheQueries(sdk: TeneoSDK, roomId: string, agents: any[]) {
305
+ // Get agent count (instant, from cache)
306
+ const count = sdk.getRoomAgentCount(roomId);
307
+ console.log(`Room agent count: ${count}`);
308
+
309
+ // Get cached agents (instant)
310
+ const cachedAgents = sdk.getRoomAgents(roomId);
311
+ if (cachedAgents) {
312
+ const names = cachedAgents.map(a => a.agent_name || "Unnamed").join(", ");
313
+ console.log(`Cached agents: ${names}`);
314
+ }
315
+
316
+ // Check if specific agent is in room (instant)
317
+ if (agents.length > 0) {
318
+ const firstAgent = agents[0];
319
+ const isInRoom = sdk.isAgentInRoom(roomId, firstAgent.agent_id);
320
+ console.log(`Is "${firstAgent.agent_name}" in room? ${isInRoom === true ? "✅ Yes" : isInRoom === false ? "❌ No" : "❓ Unknown (no cache)"}`);
321
+ }
322
+
323
+ // Get cached available agents (instant)
324
+ const cachedAvailable = sdk.getAvailableAgents(roomId);
325
+ if (cachedAvailable) {
326
+ console.log(`Cached available agents: ${cachedAvailable.length}`);
327
+ }
328
+
329
+ console.log("\n💡 These queries are instant - no network calls!");
330
+ console.log(" Cache is automatically maintained and invalidated as needed.");
331
+ }
332
+
333
+ // Run the example
334
+ main().catch(console.error);
@@ -0,0 +1,117 @@
1
+ # Claude Agent X Follower - Environment Configuration
2
+ # Copy this file to .env and fill in your values
3
+
4
+ # ============================================================================
5
+ # REQUIRED: Teneo Network Connection
6
+ # ============================================================================
7
+
8
+ # WebSocket URL for Teneo AI Network
9
+ # Production: wss://your-production-server.com/ws
10
+ # Development: wss://your-teneo-server.com/ws
11
+ WS_URL=wss://your-teneo-server.com/ws
12
+
13
+ # Ethereum Private Key (with 0x prefix)
14
+ # IMPORTANT: Never commit your actual private key to version control!
15
+ PRIVATE_KEY=0x1234567890123456789012345678901234567890123456789012345678901234
16
+
17
+ # Ethereum Wallet Address (with 0x prefix)
18
+ # If not provided, will be automatically derived from the private key
19
+ WALLET_ADDRESS=
20
+
21
+ # ============================================================================
22
+ # REQUIRED: Claude Configuration
23
+ # ============================================================================
24
+
25
+ # Anthropic API Key (Optional - only needed if Claude Code CLI is not authenticated)
26
+ # If you're using Claude Code, the example uses your local ~/.claude/.credentials.json
27
+ # If not, get an API key from: https://console.anthropic.com/
28
+ ANTHROPIC_API_KEY=sk-ant-your-api-key-here
29
+
30
+ # ============================================================================
31
+ # OPTIONAL: Room Configuration
32
+ # ============================================================================
33
+
34
+ # Default room to join on connection
35
+ # X-Agent room for KOL tracking and Twitter timeline features
36
+ DEFAULT_ROOM=x-agent-enterprise-v2
37
+
38
+ # ============================================================================
39
+ # OPTIONAL: Security Features
40
+ # ============================================================================
41
+
42
+ # Enable message signature verification (true | false)
43
+ # Verifies Ethereum signatures on incoming messages from agents
44
+ # Recommended: true for production
45
+ ENABLE_SIGNATURE_VERIFICATION=false
46
+
47
+ # Comma-separated list of trusted agent Ethereum addresses
48
+ # Only messages signed by these addresses will be accepted (if verification enabled)
49
+ # Leave empty to allow all signed messages
50
+ # Example: 0xAgent1...,0xAgent2...,0xAgent3...
51
+ TRUSTED_ADDRESSES=
52
+
53
+ # ============================================================================
54
+ # OPTIONAL: SDK Performance Tuning
55
+ # ============================================================================
56
+
57
+ # Enable agent caching (true | false)
58
+ ENABLE_CACHE=true
59
+
60
+ # Cache timeout in milliseconds (default: 300000 = 5 minutes)
61
+ CACHE_TIMEOUT=300000
62
+
63
+ # Maximum cache size (default: 100)
64
+ MAX_CACHE_SIZE=100
65
+
66
+ # ============================================================================
67
+ # OPTIONAL: Connection Settings
68
+ # ============================================================================
69
+
70
+ # Enable automatic reconnection (true | false)
71
+ ENABLE_RECONNECTION=true
72
+
73
+ # Reconnection delay in milliseconds (100-60000)
74
+ RECONNECT_DELAY=5000
75
+
76
+ # Maximum reconnection attempts (0-100, 0 = infinite)
77
+ MAX_RECONNECT_ATTEMPTS=10
78
+
79
+ # ============================================================================
80
+ # OPTIONAL: Logging
81
+ # ============================================================================
82
+
83
+ # Log level (debug | info | warn | error | silent)
84
+ # debug: Very verbose, shows all SDK operations
85
+ # info: Normal operations and important events
86
+ # warn: Warnings and potential issues
87
+ # error: Errors only
88
+ # silent: No logging
89
+ LOG_LEVEL=info
90
+
91
+ # ============================================================================
92
+ # NOTES
93
+ # ============================================================================
94
+
95
+ # 1. Environment Precedence:
96
+ # - Environment variables override .env file values
97
+ # - .env file overrides default SDK values
98
+ #
99
+ # 2. Security Best Practices:
100
+ # - Never commit .env file to git (already in .gitignore)
101
+ # - Use different private keys for dev/prod
102
+ # - Enable signature verification in production
103
+ # - Wallet address is auto-derived if not provided
104
+ #
105
+ # 3. Development Tips:
106
+ # - Set LOG_LEVEL=debug for troubleshooting
107
+ # - Disable signature verification for local testing
108
+ # - Use the x-agent-enterprise-v2 room for X/Twitter features
109
+ #
110
+ # 4. Production Checklist:
111
+ # ✓ Use production WebSocket URL
112
+ # ✓ Use secure private key (from secrets manager)
113
+ # ✓ Enable signature verification
114
+ # ✓ Set trusted agent addresses
115
+ # ✓ Set LOG_LEVEL=info or warn
116
+ # ✓ Enable all security features
117
+ # ✓ Use environment variables (not .env file)
@@ -0,0 +1,243 @@
1
+ # Quick Start Guide
2
+
3
+ Get up and running with Claude Agent + Teneo SDK in 5 minutes.
4
+
5
+ ## Step 1: Install Dependencies
6
+
7
+ ```bash
8
+ # Install Claude Agent SDK
9
+ npm install @anthropic-ai/claude-agent-sdk
10
+
11
+ # Install tsx for running TypeScript
12
+ npm install -g tsx
13
+
14
+ # Ensure Teneo SDK is built
15
+ npm run build
16
+ ```
17
+
18
+ ## Step 2: Configure Environment
19
+
20
+ Copy the example environment file:
21
+
22
+ ```bash
23
+ cp examples/claude-agent-x-follower/.env.example examples/claude-agent-x-follower/.env
24
+ ```
25
+
26
+ Edit `.env` with your credentials:
27
+
28
+ ```env
29
+ # Required: Teneo Network Connection
30
+ WS_URL=wss://your-teneo-server.com/ws
31
+ PRIVATE_KEY=0x1234567890123456789012345678901234567890123456789012345678901234
32
+ WALLET_ADDRESS=0x1234567890123456789012345678901234567890 # Optional - auto-derived
33
+
34
+ # Required: Room Configuration
35
+ DEFAULT_ROOM=general # or x-agent-enterprise-v2 for X features
36
+
37
+ # Optional: Claude API Key (if not using Claude Code CLI)
38
+ ANTHROPIC_API_KEY=sk-ant-your-key-here
39
+
40
+ # Optional: Advanced Configuration (defaults shown)
41
+ ENABLE_SIGNATURE_VERIFICATION=false
42
+ TRUSTED_ADDRESSES=
43
+ ENABLE_CACHE=true
44
+ ENABLE_RECONNECTION=true
45
+ LOG_LEVEL=info
46
+ ```
47
+
48
+ **Key Configuration Notes:**
49
+ - `WALLET_ADDRESS` is optional - automatically derived from `PRIVATE_KEY` if not provided
50
+ - `ANTHROPIC_API_KEY` only needed if Claude Code CLI is not authenticated
51
+ - `DEFAULT_ROOM` set to `general` for basic use, `x-agent-enterprise-v2` for X/Twitter features
52
+ - All performance and security settings have sensible defaults
53
+
54
+ ## Step 3: Run the Example
55
+
56
+ ### Using npm script:
57
+
58
+ ```bash
59
+ npm run example:claude
60
+ ```
61
+
62
+ ### Using tsx directly:
63
+
64
+ ```bash
65
+ npx tsx examples/claude-agent-x-follower/index.ts
66
+ ```
67
+
68
+ ### With custom prompt:
69
+
70
+ ```bash
71
+ npx tsx examples/claude-agent-x-follower/index.ts "Get timeline for VitalikButerin and analyze sentiment"
72
+ ```
73
+
74
+ ## Expected Output
75
+
76
+ ```
77
+ 🤖 Claude Agent + Teneo SDK - X Timeline Follower
78
+
79
+ 📡 Connecting to Teneo network...
80
+ ✅ Connected to Teneo
81
+
82
+ 💬 Prompt: "Get timeline for elonmusk and summarize the latest 5 tweets"
83
+
84
+ 🧠 Claude is processing...
85
+
86
+ 🔧 Tool called: get_x_timeline
87
+ 📥 Input: { username: 'elonmusk', count: 20 }
88
+
89
+ 🔍 Fetching timeline for @elonmusk (20 tweets)...
90
+
91
+ ✅ Tool result: Success
92
+
93
+ ============================================================
94
+ 📝 CLAUDE RESPONSE:
95
+ ============================================================
96
+ I've retrieved the timeline for @elonmusk. Here's a summary...
97
+ ============================================================
98
+
99
+ ✅ Done!
100
+ ```
101
+
102
+ ## Troubleshooting
103
+
104
+ ### Issue: Module not found
105
+
106
+ ```bash
107
+ # Make sure Claude Agent SDK is installed
108
+ npm install @anthropic-ai/claude-agent-sdk
109
+
110
+ # Ensure SDK is built
111
+ npm run build
112
+ ```
113
+
114
+ ### Issue: Cannot connect to Teneo
115
+
116
+ ```bash
117
+ # Check your environment variables
118
+ cat examples/claude-agent-x-follower/.env | grep WS_URL
119
+ cat examples/claude-agent-x-follower/.env | grep PRIVATE_KEY
120
+
121
+ # Verify the WebSocket URL is accessible
122
+ # Ensure your PRIVATE_KEY starts with 0x
123
+ ```
124
+
125
+ ### Issue: Wallet not whitelisted
126
+
127
+ If you see: `"🔒 Access restricted: Your wallet is not whitelisted"`
128
+
129
+ **Solution:** Contact your Teneo administrator to whitelist your wallet address for the room you're trying to access.
130
+
131
+ ### Issue: "Agents should use TypeTaskResponse instead of TypeMessage"
132
+
133
+ This is a **server-side protocol error** (not a configuration issue).
134
+
135
+ **Solutions:**
136
+ 1. Try `DEFAULT_ROOM=general` instead of `x-agent-enterprise-v2`
137
+ 2. Contact your Teneo administrator about room configuration
138
+ 3. Verify your wallet has correct permissions
139
+
140
+ ### Issue: Claude API error
141
+
142
+ ```bash
143
+ # Verify your API key
144
+ cat examples/claude-agent-x-follower/.env | grep ANTHROPIC_API_KEY
145
+
146
+ # Check API key has credits at: https://console.anthropic.com/
147
+ ```
148
+
149
+ **Alternative:** Use Claude Code CLI authentication (no API key needed):
150
+ - Already configured via `pathToClaudeCodeExecutable` in the code
151
+ - Uses your local `~/.claude/.credentials.json`
152
+
153
+ ## Next Steps
154
+
155
+ - ✅ Read the [full README](./README.md) for detailed documentation
156
+ - ✅ Modify prompts to analyze different X users
157
+ - ✅ Add more tools to the Claude agent
158
+ - ✅ Integrate with your own application
159
+
160
+ ## Example Prompts to Try
161
+
162
+ ```bash
163
+ # General information (works in 'general' room)
164
+ npx tsx examples/claude-agent-x-follower/index.ts "Give me information about Teneo Protocol"
165
+
166
+ # X/Twitter analysis (requires x-agent-enterprise-v2 room and whitelisting)
167
+ npx tsx examples/claude-agent-x-follower/index.ts "Get timeline for elonmusk and analyze sentiment"
168
+
169
+ # Topic research
170
+ npx tsx examples/claude-agent-x-follower/index.ts "What is the latest news about AI agents?"
171
+
172
+ # Compare users (X-Agent features)
173
+ npx tsx examples/claude-agent-x-follower/index.ts "Compare tweet styles of elonmusk and VitalikButerin"
174
+
175
+ # Engagement analysis (X-Agent features)
176
+ npx tsx examples/claude-agent-x-follower/index.ts "Which of AndrewYNg's recent tweets got most engagement?"
177
+ ```
178
+
179
+ **Note:** X/Twitter timeline features (`get_x_timeline` tool) require:
180
+ - Room set to `x-agent-enterprise-v2`
181
+ - Wallet whitelisted for X-Agent access
182
+ - Active X-Agent running in the room
183
+
184
+ For general testing, use `DEFAULT_ROOM=general` and non-timeline prompts.
185
+
186
+ ## Architecture Overview
187
+
188
+ ```
189
+ You (Prompt) → Claude Agent → get_x_timeline (Tool) → Teneo SDK → X-Agent → Twitter/X
190
+
191
+ Analysis & Response
192
+ ```
193
+
194
+ ## What's New in This Version
195
+
196
+ This example now uses the **modern SDKConfigBuilder pattern** with enhanced features:
197
+
198
+ ### ✨ Key Features
199
+
200
+ 1. **Automatic Wallet Derivation**
201
+ - No need to manually provide wallet address
202
+ - Automatically derived from your private key using viem
203
+
204
+ 2. **Auto-Reconnection**
205
+ - Automatic reconnection with exponential backoff
206
+ - Configurable retry attempts and delays
207
+ - Handles network interruptions gracefully
208
+
209
+ 3. **Response Caching**
210
+ - Agent response caching for better performance
211
+ - Configurable cache timeout and size
212
+ - Reduces redundant queries
213
+
214
+ 4. **Security Features**
215
+ - Optional SEC-2 message signature verification
216
+ - Trusted address whitelisting
217
+ - Configurable security policies
218
+
219
+ 5. **Flexible Configuration**
220
+ - Environment-based configuration
221
+ - Sensible defaults for all settings
222
+ - Easy to customize per environment
223
+
224
+ ### 🔧 Configuration Pattern
225
+
226
+ The example uses `SDKConfigBuilder` for clean, type-safe configuration:
227
+
228
+ ```typescript
229
+ const config = new SDKConfigBuilder()
230
+ .withWebSocketUrl(WS_URL)
231
+ .withAuthentication(PRIVATE_KEY, WALLET_ADDRESS) // Wallet auto-derived
232
+ .withRoom(DEFAULT_ROOM)
233
+ .withReconnection({ enabled: true, delay: 5000, maxAttempts: 10 })
234
+ .withCache(true, 300000, 100)
235
+ .withSignatureVerification({ enabled: false, trustedAddresses: [] })
236
+ .build();
237
+ ```
238
+
239
+ This replaces the old direct object initialization pattern and provides better IDE support and validation.
240
+
241
+ ---
242
+
243
+ That's it! You're ready to build AI-powered tools with Claude Agent and Teneo SDK.