@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,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.
|