@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,285 @@
1
+ /**
2
+ * Room Management Example
3
+ *
4
+ * Demonstrates how to create, manage, and organize multiple rooms in the Teneo SDK v2.0.
5
+ *
6
+ * This example shows:
7
+ * - Creating rooms with different configurations
8
+ * - Checking room limits and quotas
9
+ * - Querying owned vs shared rooms
10
+ * - Updating room properties
11
+ * - Deleting rooms
12
+ * - Handling room events
13
+ *
14
+ * Prerequisites:
15
+ * - Set TENEO_WS_URL environment variable
16
+ * - Set PRIVATE_KEY environment variable (64 hex characters, no 0x prefix)
17
+ *
18
+ * Run:
19
+ * npx ts-node examples/room-management-example.ts
20
+ */
21
+
22
+ import { TeneoSDK } from "../src";
23
+ import * as dotenv from "dotenv";
24
+
25
+ dotenv.config();
26
+
27
+ const wsUrl = process.env.TENEO_WS_URL!;
28
+ const privateKey = process.env.PRIVATE_KEY!;
29
+
30
+ async function main() {
31
+ console.log("šŸš€ Teneo SDK v2.0 - Room Management Example\n");
32
+
33
+ // Initialize SDK
34
+ const sdk = new TeneoSDK({
35
+ wsUrl,
36
+ privateKey,
37
+ logLevel: "info",
38
+ reconnect: true
39
+ });
40
+
41
+ // Set up event listeners for room operations
42
+ setupEventListeners(sdk);
43
+
44
+ try {
45
+ // Connect and authenticate
46
+ console.log("šŸ“” Connecting to Teneo network...");
47
+ await sdk.connect();
48
+ console.log("āœ… Connected and authenticated\n");
49
+
50
+ // Wait a moment for initial room data to load
51
+ await new Promise(resolve => setTimeout(resolve, 1000));
52
+
53
+ // Step 1: Check current room status
54
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
55
+ console.log("šŸ“Š Current Room Status");
56
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
57
+ await displayRoomStatus(sdk);
58
+
59
+ // Step 2: Create new rooms
60
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
61
+ console.log("šŸ—ļø Creating New Rooms");
62
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
63
+ const newRooms = await createSampleRooms(sdk);
64
+
65
+ // Wait for room creation events to process
66
+ await new Promise(resolve => setTimeout(resolve, 500));
67
+
68
+ // Step 3: Display updated room status
69
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
70
+ console.log("šŸ“Š Updated Room Status");
71
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
72
+ await displayRoomStatus(sdk);
73
+
74
+ // Step 4: Update a room
75
+ if (newRooms.length > 0) {
76
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
77
+ console.log("šŸ“ Updating Room");
78
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
79
+ await updateRoomExample(sdk, newRooms[0].id);
80
+ }
81
+
82
+ // Step 5: Query specific room
83
+ if (newRooms.length > 0) {
84
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
85
+ console.log("šŸ” Querying Specific Room");
86
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
87
+ const room = sdk.getRoomById(newRooms[0].id);
88
+ if (room) {
89
+ console.log(`Room ID: ${room.id}`);
90
+ console.log(`Name: ${room.name}`);
91
+ console.log(`Description: ${room.description || "N/A"}`);
92
+ console.log(`Type: ${room.is_public ? "Public" : "Private"}`);
93
+ console.log(`Created by: ${room.created_by}`);
94
+ console.log(`Created at: ${room.created_at}`);
95
+ console.log(`You are: ${room.is_owner ? "Owner" : "Member"}`);
96
+ }
97
+ }
98
+
99
+ // Step 6: Delete rooms
100
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
101
+ console.log("šŸ—‘ļø Cleaning Up (Deleting Rooms)");
102
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
103
+ await deleteRooms(sdk, newRooms);
104
+
105
+ // Wait for deletion events to process
106
+ await new Promise(resolve => setTimeout(resolve, 500));
107
+
108
+ // Step 7: Final room status
109
+ console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
110
+ console.log("šŸ“Š Final Room Status");
111
+ console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
112
+ await displayRoomStatus(sdk);
113
+
114
+ console.log("\nāœ… Room management example completed!");
115
+
116
+ } catch (error: any) {
117
+ console.error("\nāŒ Error:", error.message);
118
+ console.error(error.stack);
119
+ } finally {
120
+ // Disconnect
121
+ console.log("\nšŸ‘‹ Disconnecting...");
122
+ sdk.disconnect();
123
+ console.log("āœ… Disconnected");
124
+ }
125
+ }
126
+
127
+ function setupEventListeners(sdk: TeneoSDK) {
128
+ // Room created
129
+ sdk.on("room:created", (room) => {
130
+ console.log(` āœ… Room created: "${room.name}" (${room.id})`);
131
+ });
132
+
133
+ // Room updated
134
+ sdk.on("room:updated", (room) => {
135
+ console.log(` āœ… Room updated: "${room.name}" (${room.id})`);
136
+ });
137
+
138
+ // Room deleted
139
+ sdk.on("room:deleted", (roomId) => {
140
+ console.log(` āœ… Room deleted: ${roomId}`);
141
+ });
142
+
143
+ // Room errors
144
+ sdk.on("room:create_error", (error) => {
145
+ console.error(` āŒ Failed to create room: ${error.message}`);
146
+ });
147
+
148
+ sdk.on("room:update_error", (error, roomId) => {
149
+ console.error(` āŒ Failed to update room ${roomId}: ${error.message}`);
150
+ });
151
+
152
+ sdk.on("room:delete_error", (error, roomId) => {
153
+ console.error(` āŒ Failed to delete room ${roomId}: ${error.message}`);
154
+ });
155
+ }
156
+
157
+ async function displayRoomStatus(sdk: TeneoSDK) {
158
+ const ownedRooms = sdk.getOwnedRooms();
159
+ const sharedRooms = sdk.getSharedRooms();
160
+ const roomLimit = sdk.getRoomLimit();
161
+ const roomCount = sdk.getOwnedRoomCount();
162
+
163
+ console.log(`Room Capacity: ${roomCount}/${roomLimit} rooms used`);
164
+ console.log(`Can create more rooms: ${sdk.canCreateRoom() ? "āœ… Yes" : "āŒ No (limit reached)"}`);
165
+
166
+ console.log(`\nšŸ“ Owned Rooms (${ownedRooms.length}):`);
167
+ if (ownedRooms.length === 0) {
168
+ console.log(" (none)");
169
+ } else {
170
+ ownedRooms.forEach((room, i) => {
171
+ console.log(` ${i + 1}. "${room.name}" - ${room.is_public ? "Public" : "Private"}`);
172
+ console.log(` ID: ${room.id}`);
173
+ if (room.description) {
174
+ console.log(` Description: ${room.description}`);
175
+ }
176
+ });
177
+ }
178
+
179
+ console.log(`\nšŸ¤ Shared Rooms (${sharedRooms.length}):`);
180
+ if (sharedRooms.length === 0) {
181
+ console.log(" (none)");
182
+ } else {
183
+ sharedRooms.forEach((room, i) => {
184
+ console.log(` ${i + 1}. "${room.name}" - ${room.is_public ? "Public" : "Private"}`);
185
+ console.log(` ID: ${room.id}`);
186
+ console.log(` Created by: ${room.created_by}`);
187
+ });
188
+ }
189
+ }
190
+
191
+ async function createSampleRooms(sdk: TeneoSDK) {
192
+ const newRooms = [];
193
+
194
+ // Check if we can create rooms
195
+ if (!sdk.canCreateRoom()) {
196
+ console.log("āš ļø Cannot create rooms - limit reached");
197
+ console.log(` Current: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
198
+ return newRooms;
199
+ }
200
+
201
+ try {
202
+ // Create room 1: Private crypto research room
203
+ console.log("Creating 'Crypto Research' room...");
204
+ const cryptoRoom = await sdk.createRoom({
205
+ name: "Crypto Research",
206
+ description: "Room for cryptocurrency analysis and tracking",
207
+ isPublic: false
208
+ });
209
+ newRooms.push(cryptoRoom);
210
+
211
+ // Create room 2: Public gaming room (if we have capacity)
212
+ if (sdk.canCreateRoom()) {
213
+ console.log("Creating 'Gaming Hub' room...");
214
+ const gamingRoom = await sdk.createRoom({
215
+ name: "Gaming Hub",
216
+ description: "Public room for gaming-related AI agents",
217
+ isPublic: true
218
+ });
219
+ newRooms.push(gamingRoom);
220
+ }
221
+
222
+ // Create room 3: Research room (if we have capacity)
223
+ if (sdk.canCreateRoom()) {
224
+ console.log("Creating 'AI Research' room...");
225
+ const researchRoom = await sdk.createRoom({
226
+ name: "AI Research",
227
+ description: "Room for AI research and experimentation"
228
+ });
229
+ newRooms.push(researchRoom);
230
+ }
231
+
232
+ } catch (error: any) {
233
+ console.error(`Failed to create room: ${error.message}`);
234
+ }
235
+
236
+ return newRooms;
237
+ }
238
+
239
+ async function updateRoomExample(sdk: TeneoSDK, roomId: string) {
240
+ try {
241
+ const originalRoom = sdk.getRoomById(roomId);
242
+ if (!originalRoom) {
243
+ console.log(" āš ļø Room not found");
244
+ return;
245
+ }
246
+
247
+ console.log(`Original room name: "${originalRoom.name}"`);
248
+ console.log(`Original description: "${originalRoom.description || "N/A"}"`);
249
+
250
+ console.log("\nUpdating room...");
251
+ const updatedRoom = await sdk.updateRoom(roomId, {
252
+ name: `${originalRoom.name} (Updated)`,
253
+ description: "This room was updated via the SDK v2.0 API"
254
+ });
255
+
256
+ console.log(`\nNew room name: "${updatedRoom.name}"`);
257
+ console.log(`New description: "${updatedRoom.description}"`);
258
+
259
+ } catch (error: any) {
260
+ console.error(`Failed to update room: ${error.message}`);
261
+ }
262
+ }
263
+
264
+ async function deleteRooms(sdk: TeneoSDK, rooms: any[]) {
265
+ if (rooms.length === 0) {
266
+ console.log("No rooms to delete");
267
+ return;
268
+ }
269
+
270
+ console.log(`Deleting ${rooms.length} room(s)...\n`);
271
+
272
+ for (const room of rooms) {
273
+ try {
274
+ console.log(`Deleting "${room.name}" (${room.id})...`);
275
+ await sdk.deleteRoom(room.id);
276
+ // Wait a bit between deletions
277
+ await new Promise(resolve => setTimeout(resolve, 300));
278
+ } catch (error: any) {
279
+ console.error(`Failed to delete room ${room.id}: ${error.message}`);
280
+ }
281
+ }
282
+ }
283
+
284
+ // Run the example
285
+ main().catch(console.error);
@@ -0,0 +1,17 @@
1
+ # Teneo SDK Examples - Environment Configuration
2
+ # Copy this file to .env and fill in your actual values
3
+
4
+ # Required: WebSocket URL for Teneo network
5
+ WS_URL=wss://your-teneo-server.com/ws
6
+
7
+ # Required: Your Ethereum private key (keep this secret!)
8
+ PRIVATE_KEY=your-private-key-here
9
+
10
+ # Optional: Your wallet address (auto-derived from private key if not provided)
11
+ WALLET_ADDRESS=0x...
12
+
13
+ # Optional: Default room to join on connection
14
+ DEFAULT_ROOM=general
15
+
16
+ # Optional: Additional room ID (for multi-room examples)
17
+ ROOM_ID=your-room-id-here
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Example 1: Basic SDK Connection
3
+ *
4
+ * This example demonstrates:
5
+ * - Building SDK configuration
6
+ * - Connecting to Teneo WebSocket
7
+ * - Basic authentication
8
+ * - Graceful disconnection
9
+ *
10
+ * Run: npx tsx examples/usage/01-connect.ts
11
+ */
12
+
13
+ import "dotenv/config";
14
+ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
15
+
16
+ // Load configuration from environment
17
+ const WS_URL =
18
+ process.env.WS_URL || "wss://your-teneo-server.com/ws";
19
+ const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
20
+ const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
21
+
22
+ async function main() {
23
+ console.log("šŸš€ Example 1: Basic SDK Connection\n");
24
+
25
+ // Validate required configuration
26
+ if (!PRIVATE_KEY) {
27
+ console.error("āŒ ERROR: PRIVATE_KEY environment variable is required");
28
+ console.error("Set it with: export PRIVATE_KEY=your_private_key\n");
29
+ process.exit(1);
30
+ }
31
+
32
+ console.log("šŸ“‹ Configuration:");
33
+ console.log(` WebSocket URL: ${WS_URL}`);
34
+ console.log(` Default Room: ${DEFAULT_ROOM}`);
35
+ console.log(` Private Key: ${PRIVATE_KEY.substring(0, 10)}...`);
36
+ console.log("");
37
+
38
+ // Step 1: Build SDK configuration using the fluent builder API
39
+ console.log("āš™ļø Step 1: Building SDK configuration...");
40
+ const config = new SDKConfigBuilder()
41
+ .withWebSocketUrl(WS_URL)
42
+ .withAuthentication(PRIVATE_KEY)
43
+ // .withAutoJoinRooms([DEFAULT_ROOM])
44
+ .withLogging("info")
45
+ .withReconnection({ enabled: true, delay: 5000, maxAttempts: 3 })
46
+ .build();
47
+ console.log("āœ… Configuration built\n");
48
+
49
+ // Step 2: Create SDK instance
50
+ console.log("āš™ļø Step 2: Creating SDK instance...");
51
+ const sdk = new TeneoSDK(config);
52
+ console.log("āœ… SDK instance created\n");
53
+
54
+ // Step 3: Set up event listeners for connection lifecycle
55
+ console.log("āš™ļø Step 3: Setting up event listeners...");
56
+
57
+ sdk.on("connection:open", () => {
58
+ console.log("šŸ”Œ WebSocket connection opened");
59
+ });
60
+
61
+ sdk.on("auth:challenge", (challenge) => {
62
+ console.log("šŸ” Authentication challenge received");
63
+ });
64
+
65
+ sdk.on("auth:success", (state) => {
66
+ console.log("āœ… Authentication successful!");
67
+ console.log(` Wallet: ${state.walletAddress}`);
68
+ console.log(` Whitelisted: ${state.isWhitelisted}`);
69
+ console.log(` Rooms: ${state.rooms?.length || 0}`);
70
+ });
71
+
72
+ sdk.on("connection:close", (code, reason) => {
73
+ console.log(`šŸ”Œ Connection closed: ${code} - ${reason}`);
74
+ });
75
+
76
+ sdk.on("error", (error) => {
77
+ console.error("āŒ SDK Error:", error.message);
78
+ });
79
+
80
+ console.log("āœ… Event listeners configured\n");
81
+
82
+ try {
83
+ // Step 4: Connect to Teneo network
84
+ console.log("āš™ļø Step 4: Connecting to Teneo network...");
85
+ await sdk.connect();
86
+ console.log("āœ… Connected and authenticated!\n");
87
+
88
+ // Step 5: Check connection state
89
+ console.log("āš™ļø Step 5: Checking connection state...");
90
+ const connectionState = sdk.getConnectionState();
91
+ const authState = sdk.getAuthState();
92
+
93
+ console.log("šŸ“Š Connection Status:");
94
+ console.log(` Connected: ${connectionState.connected}`);
95
+ console.log(` Authenticated: ${connectionState.authenticated}`);
96
+ console.log(` Wallet: ${authState.walletAddress}`);
97
+ console.log("");
98
+
99
+ // Keep connection alive for a few seconds
100
+ console.log("ā³ Keeping connection alive for 3 seconds...");
101
+ await new Promise((resolve) => setTimeout(resolve, 3000));
102
+ } catch (error) {
103
+ console.error("āŒ Connection failed:", error);
104
+ process.exit(1);
105
+ } finally {
106
+ // Step 6: Graceful disconnection
107
+ console.log("\nāš™ļø Step 6: Disconnecting...");
108
+ sdk.disconnect();
109
+ sdk.destroy();
110
+ console.log("āœ… Disconnected and cleaned up\n");
111
+ console.log("šŸŽ‰ Example completed successfully!");
112
+ }
113
+ }
114
+
115
+ // Run the example
116
+ main().catch(console.error);
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Example 2: List Available Agents
3
+ *
4
+ * This example demonstrates:
5
+ * - Connecting to Teneo
6
+ * - Retrieving list of available agents
7
+ * - Inspecting agent properties (name, description, capabilities, status)
8
+ * - Using the agent registry
9
+ *
10
+ * Run: npx tsx examples/usage/02-list-agents.ts
11
+ */
12
+
13
+ import "dotenv/config";
14
+ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
15
+
16
+ // Load configuration from environment
17
+ const WS_URL =
18
+ process.env.WS_URL || "wss://your-teneo-server.com/ws";
19
+ const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
20
+ const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
21
+
22
+ async function main() {
23
+ console.log("šŸš€ Example 2: List Available Agents\n");
24
+
25
+ if (!PRIVATE_KEY) {
26
+ console.error("āŒ ERROR: PRIVATE_KEY environment variable is required\n");
27
+ process.exit(1);
28
+ }
29
+
30
+ // Build and create SDK
31
+ const config = new SDKConfigBuilder()
32
+ .withWebSocketUrl(WS_URL)
33
+ .withAuthentication(PRIVATE_KEY)
34
+ // .withAutoJoinRooms([DEFAULT_ROOM])
35
+ .withLogging("info")
36
+ .build();
37
+
38
+ const sdk = new TeneoSDK(config);
39
+
40
+ // Listen for agent list updates
41
+ sdk.on("agent:list", (agents) => {
42
+ console.log(`šŸ“‹ Agent list updated: ${agents.length} agents available`);
43
+ });
44
+
45
+ try {
46
+ // Connect to Teneo
47
+ console.log("šŸ”Œ Connecting to Teneo network...");
48
+ await sdk.connect();
49
+ console.log("āœ… Connected!\n");
50
+
51
+ // Wait a moment for agent list to populate
52
+ await new Promise((resolve) => setTimeout(resolve, 1000));
53
+
54
+ // Step 1: Get all agents
55
+ console.log("āš™ļø Step 1: Retrieving all agents...");
56
+ const agents = sdk.getAgents();
57
+ console.log(`āœ… Found ${agents.length} agents\n`);
58
+
59
+ if (agents.length === 0) {
60
+ console.log("āš ļø No agents available in the network");
61
+ console.log(" This might be because:");
62
+ console.log(" - No agents are registered in the room");
63
+ console.log(" - Agents are offline");
64
+ console.log(" - You need to wait a bit longer for the list to populate");
65
+ return;
66
+ }
67
+
68
+ // Step 2: Display agent details
69
+ console.log("šŸ“Š Agent Details:");
70
+ console.log("=".repeat(80));
71
+
72
+ agents.forEach((agent, index) => {
73
+ console.log(`\n${index + 1}. ${agent.name || "Unnamed Agent"}`);
74
+ console.log(` ID: ${agent.id}`);
75
+ console.log(` Status: ${agent.status}`);
76
+
77
+ if (agent.description) {
78
+ console.log(` Description: ${agent.description}`);
79
+ }
80
+
81
+ if (agent.room) {
82
+ console.log(` Room: ${agent.room}`);
83
+ }
84
+
85
+ if (agent.agentType) {
86
+ console.log(` Type: ${agent.agentType}`);
87
+ }
88
+
89
+ // Display capabilities
90
+ if (agent.capabilities && agent.capabilities.length > 0) {
91
+ console.log(` Capabilities (${agent.capabilities.length}):`);
92
+ agent.capabilities.forEach((cap) => {
93
+ console.log(` • ${cap.name}: ${cap.description}`);
94
+ });
95
+ }
96
+
97
+ // Display commands
98
+ if (agent.commands && agent.commands.length > 0) {
99
+ console.log(` Commands (${agent.commands.length}):`);
100
+ agent.commands.slice(0, 3).forEach((cmd) => {
101
+ console.log(` • ${cmd.trigger} ${cmd.argument || ""}`);
102
+ console.log(` ${cmd.description}`);
103
+ });
104
+ if (agent.commands.length > 3) {
105
+ console.log(` ... and ${agent.commands.length - 3} more`);
106
+ }
107
+ }
108
+ });
109
+
110
+ console.log("\n" + "=".repeat(80));
111
+
112
+ // Step 3: Get agent by ID
113
+ if (agents.length > 0) {
114
+ console.log("\nāš™ļø Step 3: Retrieving specific agent by ID...");
115
+ const firstAgent = agents[0];
116
+ const agent = sdk.getAgent(firstAgent.id);
117
+
118
+ if (agent) {
119
+ console.log(`āœ… Retrieved agent: ${agent.name}`);
120
+ console.log(` ID: ${agent.id}`);
121
+ console.log(` Status: ${agent.status}`);
122
+ }
123
+ }
124
+
125
+ // Step 4: Summary statistics
126
+ console.log("\nšŸ“ˆ Summary Statistics:");
127
+ console.log(` Total Agents: ${agents.length}`);
128
+
129
+ const onlineAgents = agents.filter((a) => a.status === "online");
130
+ console.log(` Online: ${onlineAgents.length}`);
131
+
132
+ const offlineAgents = agents.filter((a) => a.status === "offline");
133
+ console.log(` Offline: ${offlineAgents.length}`);
134
+
135
+ const agentsWithCapabilities = agents.filter(
136
+ (a) => a.capabilities && a.capabilities.length > 0
137
+ );
138
+ console.log(` With Capabilities: ${agentsWithCapabilities.length}`);
139
+
140
+ const agentsWithCommands = agents.filter((a) => a.commands && a.commands.length > 0);
141
+ console.log(` With Commands: ${agentsWithCommands.length}`);
142
+ } catch (error) {
143
+ console.error("āŒ Error:", error);
144
+ process.exit(1);
145
+ } finally {
146
+ sdk.disconnect();
147
+ sdk.destroy();
148
+ console.log("\nāœ… Disconnected");
149
+ console.log("šŸŽ‰ Example completed!");
150
+ }
151
+ }
152
+
153
+ main().catch(console.error);