@teneo-protocol/sdk 2.2.2 → 3.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/ISSUE_TEMPLATE/config.yml +1 -1
- package/CHANGELOG.md +366 -15
- package/CONCEPTS.md +182 -44
- package/README.md +524 -94
- package/dist/constants.d.ts +3 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +5 -3
- package/dist/constants.js.map +1 -1
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +9 -5
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/formatters/response-formatter.d.ts +6 -6
- package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +756 -756
- package/dist/handlers/message-handlers/agent-details-response-handler.js +2 -2
- package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/agent-error-handler.d.ts +91 -0
- package/dist/handlers/message-handlers/agent-error-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-error-handler.js +44 -0
- package/dist/handlers/message-handlers/agent-error-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +756 -756
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.js +2 -7
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
- package/dist/handlers/message-handlers/all-agents-response-handler.js +2 -2
- package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.js +6 -1
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.js +6 -1
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
- package/dist/handlers/message-handlers/base-handler.d.ts +2 -1
- package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/base-handler.js +24 -4
- package/dist/handlers/message-handlers/base-handler.js.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.d.ts +4 -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 +792 -756
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.js +23 -10
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +756 -756
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-room-agents-handler.js +2 -6
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.js +2 -5
- package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +52 -4
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.js +23 -4
- package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
- package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js +3 -2
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +12 -6
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/success-handler.d.ts +82 -0
- package/dist/handlers/message-handlers/success-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/success-handler.js +24 -0
- package/dist/handlers/message-handlers/success-handler.js.map +1 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.d.ts +110 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.js +46 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.js.map +1 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts +244 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js +58 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js.map +1 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +12 -6
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/user-authenticated-handler.js +2 -2
- package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -1
- package/dist/handlers/message-handlers/user-count-handler.js +2 -2
- package/dist/handlers/message-handlers/user-count-handler.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -4
- package/dist/index.js.map +1 -1
- package/dist/managers/admin-manager.d.ts +2 -0
- package/dist/managers/admin-manager.d.ts.map +1 -1
- package/dist/managers/admin-manager.js +3 -2
- package/dist/managers/admin-manager.js.map +1 -1
- package/dist/managers/agent-room-manager.d.ts +89 -11
- package/dist/managers/agent-room-manager.d.ts.map +1 -1
- package/dist/managers/agent-room-manager.js +99 -35
- package/dist/managers/agent-room-manager.js.map +1 -1
- package/dist/managers/index.d.ts +1 -1
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js.map +1 -1
- package/dist/managers/message-router.d.ts +45 -5
- package/dist/managers/message-router.d.ts.map +1 -1
- package/dist/managers/message-router.js +96 -24
- package/dist/managers/message-router.js.map +1 -1
- package/dist/managers/room-manager.d.ts +29 -7
- package/dist/managers/room-manager.d.ts.map +1 -1
- package/dist/managers/room-manager.js +37 -11
- package/dist/managers/room-manager.js.map +1 -1
- package/dist/payments/index.d.ts +3 -1
- package/dist/payments/index.d.ts.map +1 -1
- package/dist/payments/index.js +17 -3
- package/dist/payments/index.js.map +1 -1
- package/dist/payments/networks.d.ts +59 -0
- package/dist/payments/networks.d.ts.map +1 -0
- package/dist/payments/networks.js +192 -0
- package/dist/payments/networks.js.map +1 -0
- package/dist/payments/payment-client.d.ts +55 -10
- package/dist/payments/payment-client.d.ts.map +1 -1
- package/dist/payments/payment-client.js +172 -51
- package/dist/payments/payment-client.js.map +1 -1
- package/dist/teneo-sdk.d.ts +214 -40
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +360 -83
- package/dist/teneo-sdk.js.map +1 -1
- package/dist/types/config.d.ts +334 -25
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +114 -22
- package/dist/types/config.js.map +1 -1
- package/dist/types/events.d.ts +60 -14
- 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 +11 -4
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +9801 -7222
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +180 -40
- package/dist/types/messages.js.map +1 -1
- package/dist/utils/pricing-resolver.d.ts +1 -1
- package/dist/utils/pricing-resolver.d.ts.map +1 -1
- package/dist/utils/pricing-resolver.js +9 -1
- package/dist/utils/pricing-resolver.js.map +1 -1
- package/examples/agent-room-management-example.ts +5 -5
- package/examples/basic-usage.ts +26 -6
- package/examples/claude-agent-x-follower/index.ts +1 -1
- package/examples/minimal-chat.ts +4 -3
- package/examples/n8n-teneo/index.ts +2 -2
- package/examples/nestjs-dashboard/README.md +1 -1
- package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +3 -3
- package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +5 -5
- package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +8 -8
- package/examples/openai-teneo/index.ts +1 -1
- package/examples/payment-flow.ts +143 -0
- package/examples/production-dashboard/README.md +6 -8
- package/examples/production-dashboard/server.ts +22 -10
- package/examples/room-management-example.ts +2 -2
- package/examples/usage/01-connect.ts +0 -3
- package/examples/usage/02-list-agents.ts +0 -2
- package/examples/usage/03-pick-agent.ts +3 -4
- package/examples/usage/04-find-by-capability.ts +10 -12
- package/examples/usage/05-webhook-example.ts +2 -4
- package/examples/usage/06-simple-api-server.ts +13 -9
- package/examples/usage/07-event-listener.ts +1 -13
- package/examples/usage/README.md +33 -7
- package/examples/webhook-integration.ts +9 -9
- package/examples/x-influencer-battle-server.ts +1 -1
- package/package.json +1 -1
- package/scripts/diagnose-connection.ts +86 -0
- package/scripts/investigate-payload.ts +163 -0
- package/scripts/list-agents.ts +58 -0
- package/scripts/live-multi-network-test.ts +230 -0
- package/src/constants.ts +5 -3
- package/src/core/websocket-client.ts +10 -9
- package/src/handlers/message-handlers/agent-details-response-handler.ts +2 -2
- package/src/handlers/message-handlers/agent-error-handler.ts +47 -0
- package/src/handlers/message-handlers/agent-status-update-handler.ts +2 -7
- package/src/handlers/message-handlers/all-agents-response-handler.ts +2 -2
- package/src/handlers/message-handlers/auth-message-handler.ts +7 -1
- package/src/handlers/message-handlers/auth-success-handler.ts +7 -1
- package/src/handlers/message-handlers/base-handler.ts +24 -4
- package/src/handlers/message-handlers/index.ts +24 -0
- package/src/handlers/message-handlers/list-available-agents-handler.ts +24 -11
- package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -6
- package/src/handlers/message-handlers/list-rooms-response-handler.ts +2 -5
- package/src/handlers/message-handlers/ping-pong-handler.ts +29 -4
- package/src/handlers/message-handlers/rate-limit-notification-handler.ts +3 -2
- package/src/handlers/message-handlers/success-handler.ts +26 -0
- package/src/handlers/message-handlers/task-confirmed-handler.ts +49 -0
- package/src/handlers/message-handlers/trigger-wallet-tx-handler.ts +62 -0
- package/src/handlers/message-handlers/user-authenticated-handler.ts +2 -2
- package/src/handlers/message-handlers/user-count-handler.ts +2 -2
- package/src/index.ts +12 -4
- package/src/managers/admin-manager.ts +5 -2
- package/src/managers/agent-room-manager.ts +155 -26
- package/src/managers/index.ts +6 -1
- package/src/managers/message-router.ts +122 -27
- package/src/managers/room-manager.ts +39 -11
- package/src/payments/index.ts +20 -5
- package/src/payments/networks.ts +208 -0
- package/src/payments/payment-client.ts +211 -56
- package/src/teneo-sdk.ts +401 -70
- package/src/types/config.test.ts +24 -4
- package/src/types/config.ts +123 -25
- package/src/types/events.ts +36 -2
- package/src/types/index.ts +16 -3
- package/src/types/messages.ts +221 -57
- package/src/utils/pricing-resolver.ts +10 -2
- package/tests/direct-agent-test.ts +1 -1
- package/tests/integration/real-server.test.ts +1 -1
- package/tests/integration/websocket.test.ts +3 -3
- package/tests/multi-network-payment.test.ts +309 -0
- package/tests/multi-network.test.ts +296 -0
- package/tests/payment-flow-test.ts +6 -4
- package/tests/unit/handlers/agent-error-handler.test.ts +388 -0
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +9 -6
- package/tests/unit/handlers/agent-status-update-handler.test.ts +11 -16
- package/tests/unit/handlers/list-available-agents-handler.test.ts +11 -14
- package/tests/unit/handlers/list-room-agents-handler.test.ts +11 -15
- package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -6
- package/tests/unit/handlers/trigger-wallet-tx-handler.test.ts +431 -0
- package/tests/unit/managers/admin-manager.test.ts +183 -0
- package/tests/unit/managers/agent-room-manager.test.ts +189 -33
- package/tests/unit/sdk-new-methods.test.ts +221 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payment Flow Example - Quote-Approve payment flow with Teneo SDK
|
|
3
|
+
* Demonstrates manual quote approval: request a quote, inspect pricing, then confirm.
|
|
4
|
+
* Shows multi-network payment support with x402 v2.5 settlement router integration.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* PRIVATE_KEY=0x... pnpm tsx examples/payment-flow.ts
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { TeneoSDK, SDKConfigBuilder, SecurePrivateKey, getSupportedNetworks } from "../src";
|
|
11
|
+
|
|
12
|
+
const WS_URL = process.env.WS_URL;
|
|
13
|
+
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
|
|
14
|
+
|
|
15
|
+
async function main() {
|
|
16
|
+
if (!PRIVATE_KEY) {
|
|
17
|
+
console.error("Missing PRIVATE_KEY. Run with: PRIVATE_KEY=0x... pnpm tsx examples/payment-flow.ts");
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const secureKey = new SecurePrivateKey(PRIVATE_KEY);
|
|
22
|
+
|
|
23
|
+
// Configure SDK with manual quote approval
|
|
24
|
+
const config = new SDKConfigBuilder()
|
|
25
|
+
.withWebSocketUrl(WS_URL)
|
|
26
|
+
.withAuthentication(secureKey)
|
|
27
|
+
.withPayments({
|
|
28
|
+
autoApprove: false, // Manual approval — we'll inspect quotes first
|
|
29
|
+
maxPricePerRequest: 1000000 // Max 1 USDC (in micro-units)
|
|
30
|
+
})
|
|
31
|
+
.withReconnection({ enabled: false })
|
|
32
|
+
.withLogging("warn")
|
|
33
|
+
.build();
|
|
34
|
+
|
|
35
|
+
const sdk = new TeneoSDK(config);
|
|
36
|
+
|
|
37
|
+
// --- Payment events ---
|
|
38
|
+
|
|
39
|
+
sdk.on("quote:received", (quote) => {
|
|
40
|
+
console.log(`[quote:received] Agent: ${quote.agentName}, Price: ${quote.pricing?.pricePerUnit} micro-USDC`);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
sdk.on("payment:attached", (data) => {
|
|
44
|
+
console.log(`[payment:attached] Agent: ${data.agentId}, Amount: ${data.amount}, Command: ${data.command}`);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
sdk.on("payment:blocked", (data) => {
|
|
48
|
+
console.log(`[payment:blocked] Agent ${data.agentId} wants ${data.agentPrice} but max is ${data.maxPrice}`);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
sdk.on("payment:error", (err, agentId) => {
|
|
52
|
+
console.error(`[payment:error] Agent: ${agentId}, Error: ${err.message}`);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// --- General events ---
|
|
56
|
+
|
|
57
|
+
sdk.on("agent:response", (r) => {
|
|
58
|
+
console.log(`\n[agent:response] ${r.agentName || "Agent"}: ${r.humanized || r.content || JSON.stringify(r.raw)}`);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
sdk.on("error", (e) => console.error("[error]", e.message));
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
console.log("Connecting...");
|
|
65
|
+
await sdk.connect();
|
|
66
|
+
console.log("Connected!\n");
|
|
67
|
+
|
|
68
|
+
// Show supported networks (dynamically loaded from backend)
|
|
69
|
+
const networks = getSupportedNetworks();
|
|
70
|
+
console.log(`Supported payment networks: ${networks.join(", ")}\n`);
|
|
71
|
+
|
|
72
|
+
// Pick a room
|
|
73
|
+
const rooms = sdk.getRooms();
|
|
74
|
+
if (!rooms.length) {
|
|
75
|
+
console.log("No rooms available.");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const roomId = rooms[0].id;
|
|
80
|
+
console.log(`Using room: ${rooms[0].name || roomId}\n`);
|
|
81
|
+
|
|
82
|
+
// --- Step 1: Request a quote ---
|
|
83
|
+
console.log("Requesting quote...");
|
|
84
|
+
const quote = await sdk.requestQuote(
|
|
85
|
+
"Analyze Bitcoin trends for the past week",
|
|
86
|
+
roomId
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
console.log("\nQuote received:");
|
|
90
|
+
console.log(` Task ID: ${quote.taskId}`);
|
|
91
|
+
console.log(` Agent: ${quote.agentName} (${quote.agentId})`);
|
|
92
|
+
console.log(` Price: ${quote.pricing.pricePerUnit} micro-USDC (${quote.pricing.priceType})`);
|
|
93
|
+
console.log(` Network: ${quote.pricing.network || "default"}`);
|
|
94
|
+
console.log(` Expires: ${quote.expiresAt}`);
|
|
95
|
+
|
|
96
|
+
// Show x402 v2.5 settlement router fields
|
|
97
|
+
if (quote.raw?.data) {
|
|
98
|
+
const data = quote.raw.data as any;
|
|
99
|
+
console.log("\nSettlement Router (x402 v2.5):");
|
|
100
|
+
console.log(` Router: ${data.settlement_router || "N/A"}`);
|
|
101
|
+
console.log(` Salt: ${data.salt || "N/A"}`);
|
|
102
|
+
console.log(` Fee: ${data.facilitator_fee || "N/A"}`);
|
|
103
|
+
console.log(` Hook: ${data.hook || "N/A"}`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// --- Step 2: Decide whether to confirm ---
|
|
107
|
+
const MAX_ACCEPTABLE = 500000; // 0.5 USDC in micro-units
|
|
108
|
+
|
|
109
|
+
if (quote.pricing.pricePerUnit > MAX_ACCEPTABLE) {
|
|
110
|
+
console.log(`\nPrice ${quote.pricing.pricePerUnit} exceeds limit of ${MAX_ACCEPTABLE}. Skipping.`);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// --- Step 3: Confirm the quote and wait for the response ---
|
|
115
|
+
console.log("\nConfirming quote and waiting for response...");
|
|
116
|
+
const response = await sdk.confirmQuote(quote.taskId, {
|
|
117
|
+
waitForResponse: true,
|
|
118
|
+
timeout: 60000
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
if (response?.humanized) {
|
|
122
|
+
console.log(`\nAgent response: ${response.humanized}`);
|
|
123
|
+
} else if (response?.raw) {
|
|
124
|
+
console.log(`\nAgent response (raw): ${JSON.stringify(response.raw, null, 2)}`);
|
|
125
|
+
} else {
|
|
126
|
+
console.log("\n(No response content)");
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// --- Alternative: Check pending quote before confirming ---
|
|
130
|
+
// const pending = sdk.getPendingQuote(quote.taskId);
|
|
131
|
+
// if (pending) {
|
|
132
|
+
// console.log(`Still pending: ${pending.agentName}`);
|
|
133
|
+
// }
|
|
134
|
+
|
|
135
|
+
} catch (err) {
|
|
136
|
+
console.error("Error:", err);
|
|
137
|
+
} finally {
|
|
138
|
+
sdk.disconnect();
|
|
139
|
+
sdk.destroy();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
main();
|
|
@@ -125,7 +125,6 @@ PRIVATE_KEY=0x...your-private-key
|
|
|
125
125
|
WALLET_ADDRESS=0x...your-wallet-address
|
|
126
126
|
|
|
127
127
|
# Optional
|
|
128
|
-
DEFAULT_ROOM=general
|
|
129
128
|
PORT=3000
|
|
130
129
|
|
|
131
130
|
# Security Features
|
|
@@ -147,7 +146,6 @@ const secureKey = new SecurePrivateKey(PRIVATE_KEY);
|
|
|
147
146
|
const config = new SDKConfigBuilder()
|
|
148
147
|
.withWebSocketUrl(WS_URL)
|
|
149
148
|
.withAuthentication(secureKey, WALLET_ADDRESS) // Use encrypted key
|
|
150
|
-
.withAutoJoinRooms([DEFAULT_ROOM])
|
|
151
149
|
.withReconnection({ enabled: true, delay: 5000, maxAttempts: 10 })
|
|
152
150
|
// REL-3: Custom retry strategies for production
|
|
153
151
|
.withReconnectionStrategy({
|
|
@@ -208,7 +206,7 @@ const config = new SDKConfigBuilder()
|
|
|
208
206
|
{
|
|
209
207
|
"agent": "weather-agent",
|
|
210
208
|
"command": "weather New York",
|
|
211
|
-
"room": "
|
|
209
|
+
"room": "your-room-id"
|
|
212
210
|
}
|
|
213
211
|
```
|
|
214
212
|
|
|
@@ -223,7 +221,7 @@ const config = new SDKConfigBuilder()
|
|
|
223
221
|
- `POST /api/room/subscribe` - Subscribe to a room (v1)
|
|
224
222
|
```json
|
|
225
223
|
{
|
|
226
|
-
"roomId": "
|
|
224
|
+
"roomId": "your-room-id"
|
|
227
225
|
}
|
|
228
226
|
```
|
|
229
227
|
- `POST /api/room/unsubscribe` - Unsubscribe from a room (v1)
|
|
@@ -415,13 +413,13 @@ curl http://localhost:3000/api/agents/search/status/online
|
|
|
415
413
|
|
|
416
414
|
```typescript
|
|
417
415
|
// Fast capability search
|
|
418
|
-
const weatherAgents = sdk.
|
|
416
|
+
const weatherAgents = sdk.findAvailableAgentsByCapability("weather-forecast");
|
|
419
417
|
|
|
420
418
|
// Fast partial name search
|
|
421
|
-
const agentsWithWeather = sdk.
|
|
419
|
+
const agentsWithWeather = sdk.findAvailableAgentsByName("weather");
|
|
422
420
|
|
|
423
421
|
// Fast status filtering
|
|
424
|
-
const onlineAgents = sdk.
|
|
422
|
+
const onlineAgents = sdk.findAvailableAgentsByStatus("online");
|
|
425
423
|
```
|
|
426
424
|
|
|
427
425
|
### Configurable Retry Strategies (REL-3)
|
|
@@ -536,7 +534,7 @@ The `/health` endpoint returns comprehensive status:
|
|
|
536
534
|
},
|
|
537
535
|
"rooms": {
|
|
538
536
|
"count": 3,
|
|
539
|
-
"subscribedRooms": ["
|
|
537
|
+
"subscribedRooms": ["room-id-1", "room-id-2"]
|
|
540
538
|
}
|
|
541
539
|
}
|
|
542
540
|
```
|
|
@@ -100,7 +100,7 @@ async function initializeSDK() {
|
|
|
100
100
|
backoffMultiplier: 2
|
|
101
101
|
})
|
|
102
102
|
.withResponseFormat({ format: "both", includeMetadata: true })
|
|
103
|
-
.withLogging("
|
|
103
|
+
.withLogging("info")
|
|
104
104
|
.withCache(true, 300000, 100)
|
|
105
105
|
// CB-4: Message deduplication to prevent duplicate processing
|
|
106
106
|
.withMessageDeduplication(
|
|
@@ -495,7 +495,19 @@ app.get("/api/deduplication", (c) => {
|
|
|
495
495
|
app.post("/webhook", async (c) => {
|
|
496
496
|
const payload = await c.req.json();
|
|
497
497
|
|
|
498
|
-
|
|
498
|
+
// Filter out spammy admin broadcast events
|
|
499
|
+
const ignoredEvents = [
|
|
500
|
+
'user_count', // Admin-only: User count updates
|
|
501
|
+
'user_authenticated', // Broadcast when ANY user connects
|
|
502
|
+
'rate_limit_notification', // Rate limit warnings (usually not needed in webhooks)
|
|
503
|
+
];
|
|
504
|
+
|
|
505
|
+
if (ignoredEvents.includes(payload.event)) {
|
|
506
|
+
// Silently ignore these events - don't log, don't store, just return OK
|
|
507
|
+
return c.json({ status: "ignored" });
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
console.log("[WEBHOOK] Received:", payload.event, "| Data:", JSON.stringify(payload.data).slice(0, 100));
|
|
499
511
|
|
|
500
512
|
// Store webhook for display
|
|
501
513
|
recentWebhooks.unshift({
|
|
@@ -615,7 +627,7 @@ app.get("/api/agents/search/capability/:capability", (c) => {
|
|
|
615
627
|
|
|
616
628
|
try {
|
|
617
629
|
const capability = c.req.param("capability");
|
|
618
|
-
const agents = sdk.
|
|
630
|
+
const agents = sdk.findAvailableAgentsByCapability(capability);
|
|
619
631
|
return c.json({
|
|
620
632
|
capability,
|
|
621
633
|
count: agents.length,
|
|
@@ -634,7 +646,7 @@ app.get("/api/agents/search/name/:name", (c) => {
|
|
|
634
646
|
|
|
635
647
|
try {
|
|
636
648
|
const name = c.req.param("name");
|
|
637
|
-
const agents = sdk.
|
|
649
|
+
const agents = sdk.findAvailableAgentsByName(name);
|
|
638
650
|
return c.json({
|
|
639
651
|
query: name,
|
|
640
652
|
count: agents.length,
|
|
@@ -653,7 +665,7 @@ app.get("/api/agents/search/status/:status", (c) => {
|
|
|
653
665
|
|
|
654
666
|
try {
|
|
655
667
|
const status = c.req.param("status");
|
|
656
|
-
const agents = sdk.
|
|
668
|
+
const agents = sdk.findAvailableAgentsByStatus(status);
|
|
657
669
|
return c.json({
|
|
658
670
|
status,
|
|
659
671
|
count: agents.length,
|
|
@@ -788,7 +800,7 @@ app.post("/api/room/join", async (c) => {
|
|
|
788
800
|
return c.json({ error: "Room ID is required" }, 400);
|
|
789
801
|
}
|
|
790
802
|
|
|
791
|
-
await sdk.
|
|
803
|
+
await sdk.subscribeToPublicRoom(roomId);
|
|
792
804
|
return c.json({ success: true });
|
|
793
805
|
} catch (error: any) {
|
|
794
806
|
return c.json({ error: error.message }, 500);
|
|
@@ -808,7 +820,7 @@ app.post("/api/room/leave", async (c) => {
|
|
|
808
820
|
return c.json({ error: "Room ID is required" }, 400);
|
|
809
821
|
}
|
|
810
822
|
|
|
811
|
-
await sdk.
|
|
823
|
+
await sdk.unsubscribeFromPublicRoom(roomId);
|
|
812
824
|
return c.json({ success: true });
|
|
813
825
|
} catch (error: any) {
|
|
814
826
|
return c.json({ error: error.message }, 500);
|
|
@@ -1004,12 +1016,12 @@ app.get("/api/v2/rooms/:roomId/agents/:agentId/check", (c) => {
|
|
|
1004
1016
|
|
|
1005
1017
|
const roomId = c.req.param("roomId");
|
|
1006
1018
|
const agentId = c.req.param("agentId");
|
|
1007
|
-
const
|
|
1019
|
+
const inRoom = sdk.checkAgentInRoom(roomId, agentId);
|
|
1008
1020
|
|
|
1009
1021
|
return c.json({
|
|
1010
1022
|
roomId,
|
|
1011
1023
|
agentId,
|
|
1012
|
-
inRoom:
|
|
1024
|
+
inRoom: inRoom,
|
|
1013
1025
|
cached: true
|
|
1014
1026
|
});
|
|
1015
1027
|
});
|
|
@@ -1021,7 +1033,7 @@ app.get("/api/v2/rooms/:id/agents/count", (c) => {
|
|
|
1021
1033
|
}
|
|
1022
1034
|
|
|
1023
1035
|
const roomId = c.req.param("id");
|
|
1024
|
-
const count = sdk.
|
|
1036
|
+
const count = sdk.getCachedRoomAgentCount(roomId);
|
|
1025
1037
|
|
|
1026
1038
|
return c.json({
|
|
1027
1039
|
roomId,
|
|
@@ -84,7 +84,7 @@ async function main() {
|
|
|
84
84
|
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
85
85
|
console.log("🔍 Querying Specific Room");
|
|
86
86
|
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
87
|
-
const room = sdk.
|
|
87
|
+
const room = sdk.getRoom(newRooms[0].id);
|
|
88
88
|
if (room) {
|
|
89
89
|
console.log(`Room ID: ${room.id}`);
|
|
90
90
|
console.log(`Name: ${room.name}`);
|
|
@@ -236,7 +236,7 @@ async function createSampleRooms(sdk: TeneoSDK) {
|
|
|
236
236
|
|
|
237
237
|
async function updateRoomExample(sdk: TeneoSDK, roomId: string) {
|
|
238
238
|
try {
|
|
239
|
-
const originalRoom = sdk.
|
|
239
|
+
const originalRoom = sdk.getRoom(roomId);
|
|
240
240
|
if (!originalRoom) {
|
|
241
241
|
console.log(" ⚠️ Room not found");
|
|
242
242
|
return;
|
|
@@ -16,7 +16,6 @@ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
|
|
|
16
16
|
// Load configuration from environment
|
|
17
17
|
const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
|
|
18
18
|
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
|
|
19
|
-
const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
|
|
20
19
|
|
|
21
20
|
async function main() {
|
|
22
21
|
console.log("🚀 Example 1: Basic SDK Connection\n");
|
|
@@ -30,7 +29,6 @@ async function main() {
|
|
|
30
29
|
|
|
31
30
|
console.log("📋 Configuration:");
|
|
32
31
|
console.log(` WebSocket URL: ${WS_URL}`);
|
|
33
|
-
console.log(` Default Room: ${DEFAULT_ROOM}`);
|
|
34
32
|
console.log(` Private Key: ${PRIVATE_KEY.substring(0, 10)}...`);
|
|
35
33
|
console.log("");
|
|
36
34
|
|
|
@@ -39,7 +37,6 @@ async function main() {
|
|
|
39
37
|
const config = new SDKConfigBuilder()
|
|
40
38
|
.withWebSocketUrl(WS_URL)
|
|
41
39
|
.withAuthentication(PRIVATE_KEY)
|
|
42
|
-
// .withAutoJoinRooms([DEFAULT_ROOM])
|
|
43
40
|
.withLogging("info")
|
|
44
41
|
.withReconnection({ enabled: true, delay: 5000, maxAttempts: 3 })
|
|
45
42
|
.build();
|
|
@@ -16,7 +16,6 @@ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
|
|
|
16
16
|
// Load configuration from environment
|
|
17
17
|
const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
|
|
18
18
|
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
|
|
19
|
-
const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
|
|
20
19
|
|
|
21
20
|
async function main() {
|
|
22
21
|
console.log("🚀 Example 2: List Available Agents\n");
|
|
@@ -30,7 +29,6 @@ async function main() {
|
|
|
30
29
|
const config = new SDKConfigBuilder()
|
|
31
30
|
.withWebSocketUrl(WS_URL)
|
|
32
31
|
.withAuthentication(PRIVATE_KEY)
|
|
33
|
-
// .withAutoJoinRooms([DEFAULT_ROOM])
|
|
34
32
|
.withLogging("info")
|
|
35
33
|
.build();
|
|
36
34
|
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This example demonstrates:
|
|
5
5
|
* - Finding a specific agent by ID or name
|
|
6
|
-
* - Sending a direct command to an agent
|
|
6
|
+
* - Sending a direct command to an agent
|
|
7
|
+
* - Direct commands work in all environments (required when no coordinator)
|
|
7
8
|
* - Waiting for and receiving agent responses
|
|
8
9
|
* - Handling response formats (raw, humanized, both)
|
|
9
10
|
*
|
|
@@ -17,7 +18,6 @@ import { TeneoSDK, SDKConfigBuilder, FormattedResponse } from "../../dist/index.
|
|
|
17
18
|
// Load configuration from environment
|
|
18
19
|
const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
|
|
19
20
|
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
|
|
20
|
-
const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
|
|
21
21
|
|
|
22
22
|
async function main() {
|
|
23
23
|
console.log("🚀 Example 3: Pick and Communicate with Specific Agent\n");
|
|
@@ -34,7 +34,6 @@ async function main() {
|
|
|
34
34
|
const config = new SDKConfigBuilder()
|
|
35
35
|
.withWebSocketUrl(WS_URL)
|
|
36
36
|
.withAuthentication(PRIVATE_KEY)
|
|
37
|
-
// .withAutoJoinRooms([DEFAULT_ROOM])
|
|
38
37
|
.withResponseFormat({ format: "both", includeMetadata: true })
|
|
39
38
|
.withLogging("info")
|
|
40
39
|
.build();
|
|
@@ -143,7 +142,7 @@ async function main() {
|
|
|
143
142
|
{
|
|
144
143
|
agent: selectedAgent.id,
|
|
145
144
|
command: command,
|
|
146
|
-
room:
|
|
145
|
+
room: "room-id"
|
|
147
146
|
},
|
|
148
147
|
true
|
|
149
148
|
); // waitForResponse = true
|
|
@@ -17,7 +17,6 @@ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
|
|
|
17
17
|
// Load configuration from environment
|
|
18
18
|
const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
|
|
19
19
|
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
|
|
20
|
-
const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
|
|
21
20
|
|
|
22
21
|
async function main() {
|
|
23
22
|
console.log("🚀 Example 4: Find Agents by Capability\n");
|
|
@@ -31,7 +30,6 @@ async function main() {
|
|
|
31
30
|
const config = new SDKConfigBuilder()
|
|
32
31
|
.withWebSocketUrl(WS_URL)
|
|
33
32
|
.withAuthentication(PRIVATE_KEY)
|
|
34
|
-
// .withAutoJoinRooms([DEFAULT_ROOM])
|
|
35
33
|
.withLogging("info")
|
|
36
34
|
.build();
|
|
37
35
|
|
|
@@ -96,7 +94,7 @@ async function main() {
|
|
|
96
94
|
for (const capability of testCapabilities) {
|
|
97
95
|
console.log(`\n🔍 Searching for capability: "${capability}"`);
|
|
98
96
|
const startTime = performance.now();
|
|
99
|
-
const agentsWithCap = sdk.
|
|
97
|
+
const agentsWithCap = sdk.findAvailableAgentsByCapability(capability);
|
|
100
98
|
const duration = performance.now() - startTime;
|
|
101
99
|
|
|
102
100
|
if (agentsWithCap.length > 0) {
|
|
@@ -121,7 +119,7 @@ async function main() {
|
|
|
121
119
|
|
|
122
120
|
console.log("\n🔍 Online agents:");
|
|
123
121
|
const startTimeOnline = performance.now();
|
|
124
|
-
const onlineAgents = sdk.
|
|
122
|
+
const onlineAgents = sdk.findAvailableAgentsByStatus("online");
|
|
125
123
|
const durationOnline = performance.now() - startTimeOnline;
|
|
126
124
|
console.log(`✅ Found ${onlineAgents.length} online agents (${durationOnline.toFixed(3)}ms):`);
|
|
127
125
|
onlineAgents.forEach((agent) => {
|
|
@@ -130,7 +128,7 @@ async function main() {
|
|
|
130
128
|
|
|
131
129
|
console.log("\n🔍 Offline agents:");
|
|
132
130
|
const startTimeOffline = performance.now();
|
|
133
|
-
const offlineAgents = sdk.
|
|
131
|
+
const offlineAgents = sdk.findAvailableAgentsByStatus("offline");
|
|
134
132
|
const durationOffline = performance.now() - startTimeOffline;
|
|
135
133
|
console.log(
|
|
136
134
|
`✅ Found ${offlineAgents.length} offline agents (${durationOffline.toFixed(3)}ms):`
|
|
@@ -147,7 +145,7 @@ async function main() {
|
|
|
147
145
|
for (const term of searchTerms) {
|
|
148
146
|
console.log(`\n🔍 Searching for name containing: "${term}"`);
|
|
149
147
|
const startTime = performance.now();
|
|
150
|
-
const foundAgents = sdk.
|
|
148
|
+
const foundAgents = sdk.findAvailableAgentsByName(term);
|
|
151
149
|
const duration = performance.now() - startTime;
|
|
152
150
|
|
|
153
151
|
if (foundAgents.length > 0) {
|
|
@@ -176,12 +174,12 @@ async function main() {
|
|
|
176
174
|
console.log("Strategy: Find online agents with social-media or twitter capabilities\n");
|
|
177
175
|
|
|
178
176
|
// First, try to find by specific capabilities
|
|
179
|
-
let candidates = sdk.
|
|
177
|
+
let candidates = sdk.findAvailableAgentsByCapability("social-media");
|
|
180
178
|
if (candidates.length === 0) {
|
|
181
|
-
candidates = sdk.
|
|
179
|
+
candidates = sdk.findAvailableAgentsByCapability("twitter");
|
|
182
180
|
}
|
|
183
181
|
if (candidates.length === 0) {
|
|
184
|
-
candidates = sdk.
|
|
182
|
+
candidates = sdk.findAvailableAgentsByCapability("x-platform");
|
|
185
183
|
}
|
|
186
184
|
|
|
187
185
|
// Filter to only online agents
|
|
@@ -191,9 +189,9 @@ async function main() {
|
|
|
191
189
|
if (candidates.length === 0) {
|
|
192
190
|
console.log("⚠️ No capability match, trying name search...");
|
|
193
191
|
const nameResults = sdk
|
|
194
|
-
.
|
|
195
|
-
.concat(sdk.
|
|
196
|
-
.concat(sdk.
|
|
192
|
+
.findAvailableAgentsByName("twitter")
|
|
193
|
+
.concat(sdk.findAvailableAgentsByName("x platform"))
|
|
194
|
+
.concat(sdk.findAvailableAgentsByName("social"));
|
|
197
195
|
|
|
198
196
|
// Remove duplicates and filter online
|
|
199
197
|
const uniqueIds = new Set<string>();
|
|
@@ -28,7 +28,6 @@ import type { Request, Response } from "express";
|
|
|
28
28
|
// Load configuration from environment
|
|
29
29
|
const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
|
|
30
30
|
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
|
|
31
|
-
const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
|
|
32
31
|
const WEBHOOK_PORT = parseInt(process.env.WEBHOOK_PORT || "3001");
|
|
33
32
|
const WEBHOOK_SINK_PORT = parseInt(process.env.WEBHOOK_SINK_PORT || "3000");
|
|
34
33
|
|
|
@@ -130,7 +129,6 @@ async function main() {
|
|
|
130
129
|
const config = new SDKConfigBuilder()
|
|
131
130
|
.withWebSocketUrl(WS_URL)
|
|
132
131
|
.withAuthentication(PRIVATE_KEY)
|
|
133
|
-
// .withAutoJoinRooms([DEFAULT_ROOM])
|
|
134
132
|
.withResponseFormat({ format: "both", includeMetadata: true })
|
|
135
133
|
.withLogging("info")
|
|
136
134
|
.build();
|
|
@@ -206,7 +204,7 @@ async function main() {
|
|
|
206
204
|
{
|
|
207
205
|
agent: agent.id,
|
|
208
206
|
command: "hello webhook test",
|
|
209
|
-
room:
|
|
207
|
+
room: "room-id"
|
|
210
208
|
},
|
|
211
209
|
false
|
|
212
210
|
); // Don't wait for response
|
|
@@ -243,7 +241,7 @@ async function main() {
|
|
|
243
241
|
{
|
|
244
242
|
agent: testAgents[0].id,
|
|
245
243
|
command: "test retry",
|
|
246
|
-
room:
|
|
244
|
+
room: "room-id"
|
|
247
245
|
},
|
|
248
246
|
false
|
|
249
247
|
);
|
|
@@ -23,7 +23,6 @@ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
|
|
|
23
23
|
// Load configuration from environment
|
|
24
24
|
const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
|
|
25
25
|
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
|
|
26
|
-
const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
|
|
27
26
|
const PORT = parseInt(process.env.PORT || "3000");
|
|
28
27
|
|
|
29
28
|
// Validate configuration
|
|
@@ -40,13 +39,11 @@ app.use(express.json());
|
|
|
40
39
|
console.log("🚀 Initializing Teneo API Server\n");
|
|
41
40
|
console.log("📋 Configuration:");
|
|
42
41
|
console.log(` WebSocket: ${WS_URL}`);
|
|
43
|
-
console.log(` Room: ${DEFAULT_ROOM}`);
|
|
44
42
|
console.log(` Port: ${PORT}\n`);
|
|
45
43
|
|
|
46
44
|
const config = new SDKConfigBuilder()
|
|
47
45
|
.withWebSocketUrl(WS_URL)
|
|
48
46
|
.withAuthentication(PRIVATE_KEY)
|
|
49
|
-
// .withAutoJoinRooms([DEFAULT_ROOM])
|
|
50
47
|
.withResponseFormat({ format: "both", includeMetadata: true })
|
|
51
48
|
.withReconnection({ enabled: true, delay: 5000, maxAttempts: 10 })
|
|
52
49
|
.withLogging("info")
|
|
@@ -182,7 +179,7 @@ app.get("/agents/:id", (req: Request, res: Response) => {
|
|
|
182
179
|
app.get("/agents/capability/:capability", (req: Request, res: Response) => {
|
|
183
180
|
try {
|
|
184
181
|
const { capability } = req.params;
|
|
185
|
-
const agents = sdk.
|
|
182
|
+
const agents = sdk.findAvailableAgentsByCapability(capability);
|
|
186
183
|
|
|
187
184
|
res.json({
|
|
188
185
|
success: true,
|
|
@@ -206,6 +203,13 @@ app.get("/agents/capability/:capability", (req: Request, res: Response) => {
|
|
|
206
203
|
* POST /message
|
|
207
204
|
* Send a message to an agent
|
|
208
205
|
* Body: { message: string, agent?: string, waitForResponse?: boolean, timeout?: number }
|
|
206
|
+
*
|
|
207
|
+
* Two approaches:
|
|
208
|
+
* 1. WITH AGENT: Direct command (required in non-coordinator environments)
|
|
209
|
+
* Example: { "message": "search bitcoin 5", "agent": "X Platform Agent" }
|
|
210
|
+
*
|
|
211
|
+
* 2. WITHOUT AGENT: Coordinator routing (only works in coordinator environments)
|
|
212
|
+
* Example: { "message": "Get bitcoin info" }
|
|
209
213
|
*/
|
|
210
214
|
app.post("/message", async (req: Request, res: Response) => {
|
|
211
215
|
try {
|
|
@@ -228,12 +232,12 @@ app.post("/message", async (req: Request, res: Response) => {
|
|
|
228
232
|
const startTime = Date.now();
|
|
229
233
|
|
|
230
234
|
if (agent) {
|
|
231
|
-
// Send to specific agent
|
|
235
|
+
// Send to specific agent (direct command)
|
|
232
236
|
const response = await sdk.sendDirectCommand(
|
|
233
237
|
{
|
|
234
238
|
agent,
|
|
235
239
|
command: message,
|
|
236
|
-
room:
|
|
240
|
+
room: "room-id"
|
|
237
241
|
},
|
|
238
242
|
waitForResponse
|
|
239
243
|
);
|
|
@@ -260,7 +264,7 @@ app.post("/message", async (req: Request, res: Response) => {
|
|
|
260
264
|
} else {
|
|
261
265
|
// Send via coordinator (will auto-select agent)
|
|
262
266
|
const response = await sdk.sendMessage(message, {
|
|
263
|
-
room:
|
|
267
|
+
room: "room-id",
|
|
264
268
|
waitForResponse,
|
|
265
269
|
timeout
|
|
266
270
|
});
|
|
@@ -318,7 +322,7 @@ app.get("/rooms", (_req: Request, res: Response) => {
|
|
|
318
322
|
app.post("/rooms/:roomId/subscribe", async (req: Request, res: Response) => {
|
|
319
323
|
try {
|
|
320
324
|
const { roomId } = req.params;
|
|
321
|
-
await sdk.
|
|
325
|
+
await sdk.subscribeToPublicRoom(roomId);
|
|
322
326
|
|
|
323
327
|
res.json({
|
|
324
328
|
success: true,
|
|
@@ -340,7 +344,7 @@ app.post("/rooms/:roomId/subscribe", async (req: Request, res: Response) => {
|
|
|
340
344
|
app.post("/rooms/:roomId/unsubscribe", async (req: Request, res: Response) => {
|
|
341
345
|
try {
|
|
342
346
|
const { roomId } = req.params;
|
|
343
|
-
await sdk.
|
|
347
|
+
await sdk.unsubscribeFromPublicRoom(roomId);
|
|
344
348
|
|
|
345
349
|
res.json({
|
|
346
350
|
success: true,
|
|
@@ -17,7 +17,6 @@ import { TeneoSDK, SDKConfigBuilder } from "../../dist/index.js";
|
|
|
17
17
|
// Load configuration from environment
|
|
18
18
|
const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
|
|
19
19
|
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
|
|
20
|
-
const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
|
|
21
20
|
|
|
22
21
|
// Event counters for statistics
|
|
23
22
|
const eventStats = {
|
|
@@ -57,7 +56,6 @@ async function main() {
|
|
|
57
56
|
const config = new SDKConfigBuilder()
|
|
58
57
|
.withWebSocketUrl(WS_URL)
|
|
59
58
|
.withAuthentication(PRIVATE_KEY)
|
|
60
|
-
// .withAutoJoinRooms([DEFAULT_ROOM])
|
|
61
59
|
.withResponseFormat({ format: "both", includeMetadata: true })
|
|
62
60
|
.withLogging("info")
|
|
63
61
|
.build();
|
|
@@ -213,11 +211,6 @@ async function main() {
|
|
|
213
211
|
console.log(`🏠 [ROOM] Unsubscribed from room: ${data.roomId}`);
|
|
214
212
|
});
|
|
215
213
|
|
|
216
|
-
sdk.on("room:list", (rooms) => {
|
|
217
|
-
eventStats.room++;
|
|
218
|
-
console.log(`🏠 [ROOM] Room list received: ${rooms.length} rooms`);
|
|
219
|
-
});
|
|
220
|
-
|
|
221
214
|
// ============================================================================
|
|
222
215
|
// WEBHOOK EVENTS
|
|
223
216
|
// ============================================================================
|
|
@@ -325,11 +318,6 @@ async function main() {
|
|
|
325
318
|
}
|
|
326
319
|
});
|
|
327
320
|
|
|
328
|
-
sdk.on("warning", (warning) => {
|
|
329
|
-
eventStats.error++;
|
|
330
|
-
console.warn("⚠️ [WARNING]", warning);
|
|
331
|
-
});
|
|
332
|
-
|
|
333
321
|
// ============================================================================
|
|
334
322
|
// CONNECT AND TRIGGER EVENTS
|
|
335
323
|
// ============================================================================
|
|
@@ -361,7 +349,7 @@ async function main() {
|
|
|
361
349
|
{
|
|
362
350
|
agent: testAgent.id,
|
|
363
351
|
command: "hello event listener test",
|
|
364
|
-
room:
|
|
352
|
+
room: "room-id"
|
|
365
353
|
},
|
|
366
354
|
false
|
|
367
355
|
);
|