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