@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.
- package/.github/workflows/publish-npm.yml +8 -6
- package/CHANGELOG.md +265 -0
- package/README.md +406 -53
- package/dist/core/websocket-client.d.ts +13 -0
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +34 -3
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +70 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +904 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js +51 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.js +65 -5
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.js +46 -4
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.d.ts +5 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.js +23 -1
- package/dist/handlers/message-handlers/index.js.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +877 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js +38 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +886 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js +51 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +178 -89
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.js +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js +92 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/types.d.ts +2 -0
- package/dist/handlers/message-handlers/types.d.ts.map +1 -1
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
- package/dist/managers/agent-room-manager.d.ts +222 -0
- package/dist/managers/agent-room-manager.d.ts.map +1 -0
- package/dist/managers/agent-room-manager.js +508 -0
- package/dist/managers/agent-room-manager.js.map +1 -0
- package/dist/managers/index.d.ts +2 -0
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js +5 -1
- package/dist/managers/index.js.map +1 -1
- package/dist/managers/message-router.d.ts +1 -1
- package/dist/managers/message-router.d.ts.map +1 -1
- package/dist/managers/message-router.js +41 -4
- package/dist/managers/message-router.js.map +1 -1
- package/dist/managers/room-management-manager.d.ts +213 -0
- package/dist/managers/room-management-manager.d.ts.map +1 -0
- package/dist/managers/room-management-manager.js +440 -0
- package/dist/managers/room-management-manager.js.map +1 -0
- package/dist/managers/room-manager.d.ts +4 -4
- package/dist/managers/room-manager.d.ts.map +1 -1
- package/dist/managers/room-manager.js +1 -1
- package/dist/managers/room-manager.js.map +1 -1
- package/dist/teneo-sdk.d.ts +362 -14
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +497 -7
- package/dist/teneo-sdk.js.map +1 -1
- package/dist/types/config.d.ts +63 -54
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +9 -5
- package/dist/types/config.js.map +1 -1
- package/dist/types/error-codes.d.ts +2 -0
- package/dist/types/error-codes.d.ts.map +1 -1
- package/dist/types/error-codes.js +3 -0
- package/dist/types/error-codes.js.map +1 -1
- package/dist/types/events.d.ts +132 -68
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +27 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +11396 -2559
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +294 -27
- package/dist/types/messages.js.map +1 -1
- package/dist/types/validation.d.ts.map +1 -1
- package/dist/types/validation.js +1 -1
- package/dist/types/validation.js.map +1 -1
- package/dist/utils/bounded-queue.d.ts +1 -1
- package/dist/utils/bounded-queue.js +6 -6
- package/dist/utils/circuit-breaker.d.ts.map +1 -1
- package/dist/utils/circuit-breaker.js.map +1 -1
- package/dist/utils/event-waiter.d.ts.map +1 -1
- package/dist/utils/event-waiter.js +2 -1
- package/dist/utils/event-waiter.js.map +1 -1
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +4 -6
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/secure-private-key.d.ts.map +1 -1
- package/dist/utils/secure-private-key.js +9 -15
- package/dist/utils/secure-private-key.js.map +1 -1
- package/dist/utils/signature-verifier.d.ts +2 -2
- package/dist/utils/signature-verifier.d.ts.map +1 -1
- package/dist/utils/signature-verifier.js +5 -5
- package/dist/utils/signature-verifier.js.map +1 -1
- package/examples/.env.example +1 -1
- package/examples/agent-room-management-example.ts +334 -0
- package/examples/claude-agent-x-follower/.env.example +117 -0
- package/examples/claude-agent-x-follower/QUICKSTART.md +243 -0
- package/examples/claude-agent-x-follower/README.md +540 -0
- package/examples/claude-agent-x-follower/index.ts +248 -0
- package/examples/claude-agent-x-follower/package.json +37 -0
- package/examples/claude-agent-x-follower/tsconfig.json +20 -0
- package/examples/n8n-teneo/.env.example +127 -0
- package/examples/n8n-teneo/Dockerfile +42 -0
- package/examples/n8n-teneo/README.md +564 -0
- package/examples/n8n-teneo/docker-compose.yml +71 -0
- package/examples/n8n-teneo/index.ts +177 -0
- package/examples/n8n-teneo/package.json +22 -0
- package/examples/n8n-teneo/tsconfig.json +12 -0
- package/examples/n8n-teneo/workflows/x-timeline.json +66 -0
- package/examples/openai-teneo/.env.example +130 -0
- package/examples/openai-teneo/README.md +635 -0
- package/examples/openai-teneo/index.ts +280 -0
- package/examples/openai-teneo/package.json +24 -0
- package/examples/openai-teneo/tsconfig.json +16 -0
- package/examples/production-dashboard/.env.example +5 -3
- package/examples/production-dashboard/README.md +839 -0
- package/examples/production-dashboard/pnpm-lock.yaml +92 -0
- package/examples/production-dashboard/public/dashboard.html +1150 -504
- package/examples/production-dashboard/server.ts +428 -12
- package/examples/room-management-example.ts +285 -0
- package/examples/usage/.env.example +17 -0
- package/examples/usage/01-connect.ts +116 -0
- package/examples/usage/02-list-agents.ts +153 -0
- package/examples/usage/03-pick-agent.ts +201 -0
- package/examples/usage/04-find-by-capability.ts +237 -0
- package/examples/usage/05-webhook-example.ts +319 -0
- package/examples/usage/06-simple-api-server.ts +396 -0
- package/examples/usage/07-event-listener.ts +402 -0
- package/examples/usage/README.md +383 -0
- package/examples/usage/package.json +42 -0
- package/package.json +13 -3
- package/src/core/websocket-client.ts +43 -9
- package/src/formatters/response-formatter.test.ts +8 -2
- package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +83 -0
- package/src/handlers/message-handlers/agent-status-update-handler.ts +58 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +73 -5
- package/src/handlers/message-handlers/auth-success-handler.ts +58 -6
- package/src/handlers/message-handlers/index.ts +19 -0
- package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
- package/src/handlers/message-handlers/list-room-agents-handler.ts +61 -0
- package/src/handlers/message-handlers/regular-message-handler.ts +1 -0
- package/src/handlers/message-handlers/room-operation-response-handler.ts +105 -0
- package/src/handlers/message-handlers/types.ts +6 -0
- package/src/handlers/webhook-handler.test.ts +13 -10
- package/src/managers/agent-room-manager.ts +609 -0
- package/src/managers/index.ts +2 -0
- package/src/managers/message-router.ts +48 -6
- package/src/managers/room-management-manager.ts +523 -0
- package/src/managers/room-manager.ts +12 -6
- package/src/teneo-sdk.ts +543 -10
- package/src/types/config.ts +13 -6
- package/src/types/error-codes.ts +4 -0
- package/src/types/events.ts +24 -0
- package/src/types/index.ts +55 -0
- package/src/types/messages.ts +374 -41
- package/src/types/validation.ts +4 -1
- package/src/utils/bounded-queue.ts +9 -9
- package/src/utils/circuit-breaker.ts +4 -1
- package/src/utils/deduplication-cache.test.ts +2 -6
- package/src/utils/event-waiter.test.ts +4 -1
- package/src/utils/event-waiter.ts +5 -7
- package/src/utils/rate-limiter.test.ts +5 -17
- package/src/utils/rate-limiter.ts +6 -9
- package/src/utils/secure-private-key.test.ts +66 -59
- package/src/utils/secure-private-key.ts +10 -16
- package/src/utils/signature-verifier.test.ts +75 -70
- package/src/utils/signature-verifier.ts +7 -8
- package/src/utils/ssrf-validator.test.ts +3 -3
- package/tests/integration/room-management.test.ts +514 -0
- package/tests/integration/websocket.test.ts +1 -1
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +394 -0
- package/tests/unit/handlers/agent-status-update-handler.test.ts +407 -0
- package/tests/unit/handlers/auth-success-handler-rooms.test.ts +699 -0
- package/tests/unit/handlers/list-available-agents-handler.test.ts +256 -0
- package/tests/unit/handlers/list-room-agents-handler.test.ts +294 -0
- package/tests/unit/handlers/room-operation-response-handler.test.ts +527 -0
- package/tests/unit/managers/agent-room-manager.test.ts +534 -0
- 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);
|